Articles of multithreading

如何用ps -axlfind在Linux上运行的Java线程?

我有一个运行两个线程的JVM。 是否有可能在我的Linux操作系统上使用ps -axl来查看这些正在运行的线程? 我试图找出操作系统给我的线程的优先级。 有关这个其他问题的更多信息。

如何增加最大数量的JVM线程(Linux 64位)

在15G内存的Linux机器上,我不能创build超过32k的Java线程。

我如何等待任何/所有的pthreads完成?

我只想让我的主线程在退出之前等待任何和所有的(p)线程完成。 线程出入有很多原因不同,我真的不想跟踪所有这些 – 我只是想知道他们什么时候都走了。 wait()为subprocess执行此操作,在没有subprocess的情况下返回ECHILD,但wait并不(看起来像)(p)线程。 我真的不想经历保持每一个未完成的线程列表的麻烦(因为他们来来去去),然后不得不每个调用pthread_join。 有没有一个快速和肮脏的方法来做到这一点?

如何使用PTRACE获得多个线程的一致视图?

当我正在处理这个问题时 ,我遇到了一个使用ptrace的可能的想法,但是我无法正确理解ptrace如何与线程交互。 假设我有一个给定的,multithreading的主进程,我想附加到它的一个特定的线程(也许从一个分叉的孩子)。 我可以附加到特定的线程? (手册在这个问题上有分歧。) 如果是这样,这是否意味着单步只通过一个线程的指示? 它是否会停止所有进程的线程? 如果是这样,当我调用PTRACE_SYSCALL或PTRACE_SINGLESTEP ,或所有线程继续时,所有其他线程保持停止? 有一种方法只能在一个单线程中前进,但保证其他线程保持停止状态? 基本上,我想通过强制所有线程停止来同步原始程序,然后通过单步执行一个跟踪线程来执行一小组单线程指令。 我个人的尝试迄今看起来有点像这样: pid_t target = syscall(SYS_gettid); // get the calling thread's ID pid_t pid = fork(); if (pid > 0) { waitpid(pid, NULL, 0); // synchronise main process important_instruction(); } else if (pid == 0) { ptrace(target, PTRACE_ATTACH, NULL, NULL); // does this work? // […]

在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() […]