Articles of multithreading

在Linux x86 GAS程序集中是否可以创build没有系统调用的线程?

在学习“汇编语言”的时候(在x86架构上,使用GNU作为汇编语言),其中一个时刻就是使用系统调用的可能性。 这些系统调用非常方便,有时甚至是必要的,因为程序在用户空间中运行 。 然而,系统调用在性能方面相当昂贵,因为它们需要中断(当然还有一个系统调用),这意味着上下文切换必须从用户空间中的当前活动程序切换到在内核空间中运行的系统。 我想说的是:我正在实现一个编译器(用于大学项目),我想添加的额外function之一是支持multithreading代码,以提高编译的程序的性能。 因为一些multithreading的代码会由编译器自动生成,所以这几乎可以保证multithreading代码中会有一小部分。 为了取得胜利,我必须确定使用线程会使这种情况发生。 然而,我的恐惧是,为了使用线程,我必须进行系统调用和必要的中断。 微小的(自动生成的)线程将因此受到进行这些系统调用所花费的时间的高度影响,甚至可能导致性能下降。 因此,我的问题是双重的(下面有一个额外的奖励问题): 是否有可能编写可以同时在多个内核上同时运行多个线程的汇编代码, 而不需要系统调用? 如果我有非常小的线程(线程总执行时间很小),性能会有所下降,还是不值得花费精力,我会获得性能上的提升吗? 我的猜测是multithreading汇编代码不可能没有系统调用。 即使是这样的情况,你是否有build议(甚至更好:一些真正的代码)尽可能高效地执行线程?

multithreading的叉子

fork()函数可用于复制multithreading进程。 如果是这样,所有的线程将完全相同,如果没有,为什么不。 如果复制不能通过fork完成,还有其他的function可以为我做吗?

在Linux上相互等效

在C ++ Linux应用程序中,获取Win32上的Interlocked函数提供的function的最简单方法是什么? 具体来说,一个轻量级的方式来自动增加或添加32或64位整数?

如果在一个单独的线程中closures(2)文件描述符,select(2)会做什么?

select(2)函数在正在监视的文件描述符被另一个线程closures时的行为是什么? 从一些粗略的testing,它确实马上返回。 我怀疑结果是(a)它仍然在等待数据,但如果你真的试图读取它,你会得到EBADF(可能 – 有潜在的种族)或(b)它假装像文件描述符从来没有被传入。如果后一种情况是真的,传入一个没有超时的fd会导致死锁,如果它被closures。

如何调度/创build用户级线程,以及如何创build内核级线程?

道歉,如果这个问题是愚蠢的。 我试图在网上find一个相当长的答案,但不能,所以我在这里问。 我正在学习线程,而且我一直在浏览这个链接和这个关于内核级和用户级线程的Linux Plumbers Conference 2013video ,并且据我所知,使用pthreads在用户空间创build线程,内核不知道关于这个,并且只将它视为一个单独的进程,不知道里面有多less个线程。 在这种情况下, 谁决定这些用户线程在进程获得的时间片期间的调度,因为内核把它视为单个进程并且不知道线程,调度是如何完成的? 如果pthread创build用户级别的线程,如果需要,如何从用户空间程序创build内核级别或操作系统线程? 根据上面的链接,它说操作系统内核提供系统调用来创build和pipe理线程。 那么clone()系统调用是创build一个内核级线程还是用户级线程? 如果它创build了一个内核级线程,那么一个简单的pthreads程序的 strace也会显示在执行时使用clone(),但为什么会被认为是用户级线程呢? 如果它不创build内核级线程,那么如何从用户空间程序创build内核线程? 根据链接,它说:“每个线程需要一个完整的线程控制块(TCB)来维护关于线程的信息,结果造成了很大的开销和内核复杂度的增加”,所以在内核级线程中,堆是共享的,其余的都是个人的线程? 编辑: 我在询问用户级线程的创build,因为这里有一个对许多对一个模型的引用,许多用户级线程映射到一个内核级线程,线程pipe理在用户空间由线程库。 我只看到使用pthreads的引用,但不确定它是否创build用户级别或内核级别的线程。

Linux中的进程和线程之间的区别

在阅读了Robert Love的这个答案和“Linux Kernel Development”之后,随后在clone()系统调用中,我发现Linux中的进程和线程几乎与内核不可区分。 他们之间有一些调整(在所引用的SO问题中被讨论为“更多分享”或“更less分享”),但是我仍然有一些问题还有待回答。 我最近在一个涉及几个POSIX线程的程序上工作,并决定在这个前提下进行实验。 在创build两个线程的过程中,所有线程当然会得到由pthread_self()返回的唯一值, 但不是由getpid() 。 我创build的示例程序如下: #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <pthread.h> void* threadMethod(void* arg) { int intArg = (int) *((int*) arg); int32_t pid = getpid(); uint64_t pti = pthread_self(); printf("[Thread %d] getpid() = %d\n", intArg, pid); printf("[Thread %d] pthread_self() = %lu\n", intArg, pti); } int main() […]

Linux计划一个进程或线程?

读完这个问题后,我有一些疑问。 请帮助理解。 调度涉及决定何时运行一个过程以及多less时间。 Linux内核调度一个线程或进程? 由于进程和线程在内核中没有区别,调度程序如何处理它们? 每个线程的量子是如何决定的? 一个。 如果一个时间量(比如说100us)被确定为一个进程,那么在进程的所有线程之间进行共享? 或者b。 调度程序决定每个线程的量程? 注意:问题1和问题2是相关的,可能看起来一样,但只是想澄清事情的工作原理。

从后台工作线程修改Qt GUI

我在Qt中工作,当我按下GObutton时,我需要不断地将包发送到networking,并使用我收到的信息修改接口。 问题是,我有一段while(1)在button,所以button永远不会完成,所以接口永远不会更新。 我想在button中创build一个线程,并把while(){}代码放在那里。 我的问题是我怎样才能从线程修改接口? (例如,我怎样才能从线程修改文本框?

Tomcat不停止。 我怎样才能debugging呢?

我有一个运行在Linux中的Tomcat 7 ,通过$CATALINA_HOME/bin/startup.sh启动,并通过$CATALINA_HOME/bin/shutdown.sh 来自/etc/init.d 除了1个问题,一切都可以。 有时候tomcat不会停止。 虽然我停下来,我看到在catalina.out日志下降,如果我做ps -ef我仍然可以看到进程运行。 可能是什么问题呢? 我怎样才能debugging呢? 我的感觉是,这与线程有关。 所以可疑的部分如下: 1)我使用Log4j的LogManager来检测log4jconfiguration是否已经改变,但是我做Log4jManager.shutdown的contextDestroyed ServletContextListener 2)我使用H2数据库,我看到关机: 严重:Web应用程序[/ MyApplication]似乎已经开始了 线程命名为[H2 Log Writer MYAPPLICATION],但未能阻止它。 这很可能造成内存泄漏 严重:Web应用程序[/ MyApplication]似乎已经开始了 线程命名为[H2 File Lock Watchdog /opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db],但已 未能阻止它。 这很可能造成内存泄漏。 Apr 2, 2012 9:08:08 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVERE:Web应用程序[/ MyApplication] 似乎已经启动了一个名为[FileWatchdog]的线程,但失败了 停止它。 这很可能造成内存泄漏。 请帮忙吗? 我怎样才能在这里发现问题? 更新: 我按照@daveb的build议kill -3 ,在catalina.out中我看到: JVMDUMP006I正在处理转储事件“user”,详细信息“” – 请稍候。 JVMDUMP032I JVM使用“/etc/init.d/javacore.20120402.093922.2568.0001.txt”请求Java转储以响应事件JVMDUMP010I写入到/etc/init.d/javacore.20120402.093922.2568.0001.txt的Java转储JVMDUMP013I处理的转储事件“用户”,详细信息“”。 /etc/init.d有一个javacore,但我不知道如何处理它。 即我应该调查哪些部分

如何防止作者在pthreads读写locking中的饥饿

我有一些关于* nix系统上的POSIX Pthreads读写锁的问题,比如Linux。 我想知道什么是读写锁的默认偏见,即它喜欢读取写入,反之亦然? 它是否提供了一些API来改变这种默认行为。 posix pthread是否提供了一些API,以便我们可以更改pthread_rwlock_t以防止作者饿死? 从我读过的(请纠正我,如果我错了),默认实现偏向读者线程,所以写作线程可能面临饥饿。 我已经阅读了由David Butenhof编写的使用Posix线程编程的书中rw锁的示例实现。 我想知道posix pthreads如何处理作家线程的饥饿? 是否有一些使用我们可以设置读写锁的属性,以防止写挨饿(我从来没有听说过)? 或者用户不得不处理这个问题? 如果你认为答案是实现定义的,那么请举例说明在Linux中是如何完成的,因为那就是我正在寻找的。 请注意,我只想要一个* nix系统的解决scheme。 不要以为我很粗鲁,但发布一些特定于Windows的代码对我来说是无用的。 谢谢大家的帮助和耐心:)