检查pthread线程是否阻塞



情况是这样的,我有一个线程正在运行,它部分由我不拥有的代码控制。我启动了线程,所以我有它的线程id,然后我把它传递给其他代码。我需要能够告诉其他代码是否已经导致线程阻塞从另一个线程,我在控制。在pthreads中有办法做到这一点吗?我想我正在寻找的东西相当于getState()方法在Java的线程类(http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState())。

-------------- 编辑 -----------------

如果解决方案依赖于平台,则没关系。我已经找到了linux使用/proc文件系统的解决方案。

您可以为一些pthreads函数编写包装器,它将在调用原始函数之前/之后简单地更新一些状态信息。这将允许您跟踪哪些线程正在运行,何时获取或持有互斥锁(以及哪些互斥锁),何时等待哪些条件变量,等等。

当然,这只告诉您它们何时阻塞在pthreads同步对象上——它不会告诉您它们何时阻塞在其他对象上。

在将线程交给其他代码之前,设置一个由互斥锁保护的标志。当线程从不受控制的代码返回时,清除受互斥锁保护的标志。然后,您可以从需要的任何地方检查线程是否在您不控制的代码中。

从代码外部看,阻塞和非阻塞之间没有区别。如果您直接检查线程的状态,您将得到无意义的结果。

例如,考虑两个库实现:

A:我们在调用线程中完成所有的工作。

B:我们调度一个工作线程来做这项工作。调用线程阻塞,直到工作线程完成。

在A和B这两种情况下,你无法控制的代码同样在向前推进。你的"getstate"理念将提供不同的结果。所以这不是你想要的

最新更新