2010-08-13 65 views
15

我在POSIX/Linux环境中有一个多线程应用程序 - 我无法控制创建pthread的代码。在某些时候,进程 - pthreads的所有者 - 接收到一个信号。POSIX API调用列出进程中运行的所有pthreads

该信号的处理程序应该中止,取消或停止所有的pthread并记录运行的pthread数量。

我的问题是,我找不到如何列出正在运行的所有pthreads。

回答

20

似乎没有任何可移植的方式来枚举进程中的线程。

Linux有pthread_kill_other_threads_np,看起来像原来纯粹的用户态pthreads实现中的剩余部分,可能会或可能不会像今天记录的那样工作。它不会告诉你有多少线程。

您可以通过查看/proc/self(或者对于其他进程,/proc/123)获得有关您的流程的大量信息。虽然许多unice都有一个带有该名称的文件或目录,但版式完全不同,因此使用/proc的任何代码都将是Linux特有的。内核源文件/proc位于Documentation/filesystems/proc.txt。特别是,/proc/self/task有一个每个线程的子目录。子目录的名称是LWP ID;不幸的是,[1][2][3]似乎没有办法将LWP ID与pthread ID相关联(但如果您为此工作,可以使用gettid(2)获得您自己的线程ID)。当然,阅读/proc/self/task不是原子的;线程的数量可以通过/proc/self/status自动获得(但当然,在你采取行动之前它可能会发生变化)。

如果使用Linux pthreads获得的有限支持无法达到您想要的效果,另一种策略是播放动态链接技巧,以提供您自己的版本pthread_create,该版本记录到可以在以后检查的数据结构中。

+0

非常感谢您的回复。我喜欢你最后的解决方案。我会稍微调查一下。我宁愿避免读/ proc/stuff,主要是因为可移植性问题。 – 2010-08-13 11:24:33

0

你可以换行ps -eLF(或者更接近你刚才感兴趣的进程的另一个命令)并且读取NLWP列来找出有多少线程正在运行。

+0

谢谢,但我宁愿去API调用 - 如果存在。但我不知道如何使用此解决方案停止或销毁pthread。 – 2010-08-13 10:16:16

+0

@msalvadores,true,停止程序内的线程将不会与我的hacky答案一起工作 - 但您可以退出(2)此过程,或者您的信号处理程序可以设置一个全局变量,线程会定期检查;当它被设置时,线程退出。 – sarnold 2010-08-13 10:48:05

-4

鉴于线程在您的过程中,它们应该在您的控制之下。您可以将它们全部记录在数据结构中并进行跟踪。

但是,除非它被适当地管理(或者你只能创建和连接一个线程中的线程),否则这样做不会成为竞态条件。

你使用的库创建的任何线程都是他们的业务,你不应该搞乱它们的目录,否则库可能会中断。

如果你打算退出进程,你可以让线程继续运行,因为调用exit()会终止它们。

请记住,一个强大的应用应该是碰撞安全的,所以你不应该依靠关闭行为,以避免数据丢失等

+1

>鉴于线程正处于您的过程中,它们应该在您的控制之下:这是错误的。库可以创建进程,并且如果您在另一个VM内运行,则无法控制线程创建。 – 2014-11-09 14:25:57