【问题标题】:Determine whether a thread is blocked判断线程是否阻塞
【发布时间】:2011-02-09 15:19:48
【问题描述】:

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

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

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

【问题讨论】:

  • 如果已经在使用Boost::Thread,为什么不也使用Boost::asio来读取呢?
  • 据我所知,Boost.Asio 不能解决我的问题。我需要能够确定线程当前是否正在阻塞,如果是则中断它。 Boost.Asio 通常会很有用,但不能解决这个问题,对吧?

标签: pthreads signals blocking boost-thread nptl


【解决方案1】:

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

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

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

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

recvfrom() 也应该更改为使用MSG_DONTWAIT 标志,因为我们不想在这里阻止,而是总是在poll() / select() 中阻止)。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 好点...谢谢...您是说在 Boost.Threads 中没有办法做到这一点,或者在 pthreads/NPTL 中也不能做到这一点?我认为是这样,所以我必须回到更底层的东西,我认为我不想这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多