检查pthread线程是否阻塞

时间:2011-09-22 22:54:42

标签: pthreads blocking

这是情况,我有一个运行的线程,部分由我不拥有的代码控制。我启动了线程所以我有它的线程ID,但后来我把它传递给其他一些代码。我需要能够判断其他代码是否当前导致该线程阻止我控制的另一个线程。在pthreads中有办法做到这一点吗?我想我正在寻找与Java的Thread类中的getState()方法等效的东西(http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState())

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

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

2 个答案:

答案 0 :(得分:2)

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

当然,这只会告诉您何时在pthreads同步对象上被阻止 - 它们不会告诉您何时阻止其他内容。

答案 1 :(得分:-1)

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

从代码外部,阻止和未阻止之间没有区别。如果你真的检查了线程的状态,你会得到无意义的结果。

例如,考虑两个库实现。

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

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

在A和B两种情况下,您无法控制的代码同样取得了进展。你的'getstate'想法会提供不同的结果。所以这不是你想要的。