1

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

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

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

4

2 回答 2

2

这并不容易(可以使用为调试器设计的功能,但它既不简单、便携也不安全)。

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

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

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

(The recvfrom() should also be changed to use the MSG_DONTWAIT flag, since we never want to block here, and always block in the poll() / select() instead).

于 2011-02-10T01:59:44.413 回答
0

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

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

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

我知道您有理由在这里问,但恕我直言,最好从更高层次的角度考虑您的问题,并以一种无需此类黑客攻击即可实现目标的方式修复您的设计。

于 2011-02-09T15:36:24.067 回答