2011-02-09 137 views
1

有谁知道一种方法来确定线程当前是否阻塞?基本上,我想检查一个特定线程是否被阻塞(在这种情况下,在AF_UNIX数据报套接字接收调用),并发送一个信号中断,如果它是。确定线程是否被阻塞

我正在使用Boost.Thread的意思下使用pthreads在Linux上工作。我的系统有NPTL。

我认为答案是“否”,但想看看我是否错过了一些东西。

+0

如果已经使用Boost :: Thread,为什么不使用Boost :: asio来读? – Max 2011-02-09 15:40:49

+0

据我所知,Boost.Asio不会解决我的问题。我需要能够确定线程当前是否阻塞,如果它是中断的话。 Boost.Asio通常会很有用,但并不能解决这个问题,对吧? – deuberger 2011-02-09 16:04:10

回答

2

这不太可能(可以使用专门用于调试器的功能,但它既不简单,便携也不安全)。

无论如何,你并不是真的想这么做,因为这样的使用会产生固有的竞争条件。您可以检查线程是否在即将阻止之前阻止(在这种情况下,您将错过唤醒线程),或者在发现线程阻塞之后阻止线程阻塞。

通常的方法来解决你的问题就是“自管绝招”:

  • pipe()创建一条管道;
  • 目标线程,而不是在recvfrom()中阻塞,而是在poll()select()中阻止。要监视的文件描述符包括数据报套接字和管道的读取结束。
  • 要唤醒目标线程,另一个线程将一个字节写入管道的写入端。

(该recvfrom()也应改为使用MSG_DONTWAIT标志,因为我们从来没有想在这里封锁,始终挡在了poll()/select()代替)。

0

答案是否定的。在你的平台上可能有一种方法可以做到这一点,但总的来说,我知道没有办法做到这一点。

现在,你潜入你的平台的下级文件之前三思而后行,如果这是你真正想要什么:

一个线程被阻塞的一个原因。例如,它可能在FILE IO中被阻塞。如果您正确处理返回值,这可能会被安全地中断。另一方面,线程也可能在新的/删除调用或其他标准库函数中被阻塞。中断运行时库中的线程是发生灾难的收据。

我知道你有理由在这里提问,但是imho最好从更高层次角度考虑你的问题,并以一种可以在没有这种黑客攻击的情况下达到目标的方式修复你的设计。