确定线程是否被阻止

时间:2011-02-09 15:19:48

标签: pthreads signals blocking boost-thread nptl

有没有人知道确定线程当前是否阻止的方法?基本上,我想检查某个线程是否阻塞(在这种情况下是在AF_UNIX数据报套接字接收调用上)并向其发送信号以进行中断(如果是)。

我正在使用Boost.Thread在Linux上工作,这意味着我正在使用pthreads。我的系统有NPTL。

我认为答案是“不”,但想看看我是否遗漏了什么。

2 个答案:

答案 0 :(得分:2)

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

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

解决问题的常用方法是“自我管道技巧”:

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

(还应更改recvfrom()以使用MSG_DONTWAIT标记,因为我们绝不想在此处阻止,并始终在poll() / select()中阻止

答案 1 :(得分:0)

答案是否定的。可能有一种方法可以在您的平台上执行此操作,但总的来说,我知道无法执行此操作。

现在,在您深入了解平台的较低级别文档之前,请三思而后行,如果这真的是您想要的:

由于某种原因,线程始终被阻止。例如,它可能在FILE IO中被阻止。如果正确处理返回值,则可以安全地中断此操作。另一方面,线程也可能在新的/删除调用或另一个标准库函数中被阻塞。中断运行时库中的线程是灾难的收据。

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