Articles of multithreading

在Linux中获取Java线程的线程ID

我有一个Java应用程序创build一些线程(通过new Thread() )。 使用ps我可以看到他们有不同的线程ID(LWP列),我想从Java应用程序中获得这些ID。 在大多数与本主题相关的post(例如, 本文 )中,解决scheme是使用ManagementFactory.getRuntimeMXBean().getName() 。 然而,使用这种方法,给了我主线程的PID(即使我从一个线程调用它),所以它不是真正解决我的问题。 有什么办法来获得应用程序创build的每个Thread的线程ID? 是否有可能使用JNI来实现它? 如果以某种方式,我可以连接到一个C函数,我可以调用syscall(__NR_gettid) ,这可以解决我的问题。 我真的不关心可移植性,所以我完全可以使用只适用于Linux机器的解决scheme。 更新:我实际上已经通过使用JNI解决了我的问题。 细节在我的答案中解释。 谢谢大家的build议/意见。

setitimer,SIGALRM和multithreading进程(linux,c)

我想在使用NPTL的libc的linux 2.6+中的multithreading进程中使用setitimer() (或更less的可能性, alarm() )。 哪个线程将从内核接收sigalarm (SIGALRM) ? 谢谢。 2014-04更新:如何在multithreading程序中设置setitimer() ,如果我想编写一个类似gperftools的cpuprofile的分析工具; 但在我的工具,我想支持dynamic链接的程序(所以有可能注入我自己的库到init分析)和静态链接的程序(没有做^^^^^^的可能性)。 我当前的分析工具在setitimer fork()和exec()之前设置setitimer ,它还使用ptrace来控制目标程序并劫持由setitimer生成的SIGPROF / SIGVPROF / SIGALRM。 我不知道它是如何与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。