【问题标题】:Terminating a blocked pthreads thread终止阻塞的 pthreads 线程
【发布时间】:2013-04-02 06:21:15
【问题描述】:

我有一个线程从文件描述符中读取数据,使用select() 阻塞直到数据可用。 当程序需要终止时,我需要关闭线程,但是它在选择时被阻塞。

我的问题,通过关闭文件描述符来通知线程我打算终止是一个好习惯吗?

有没有更好的方法来通知线程? 我知道总有一个使用信号的选项,但是我在某些地方读到信号pthreads 不能很好地协同工作。

【问题讨论】:

  • 为什么你设置select一直被阻塞?给它一个超时!当达到超时并且没有事件发生时,循环检查一个标志,确定它是否必须连续运行。跨度>
  • 如果从另一个线程关闭 FD 会发生什么?
  • Select 将在线程中返回错误代码。
  • 好的,听起来不错。 Cetainly 听起来比一些引入可避免的 CPU 浪费和终止延迟的破旧的超时循环更好。好像行得通,而且是单行的。会有多少“更好”?
  • 我觉得这个方法很好,但是,有人跟我说这是滥用接口。我只是想知道是否有更好的方法来做到这一点,到目前为止,我赢了...... :)

标签: c++ c linux pthreads file-descriptor


【解决方案1】:

您可以使用管道,并将其添加到您的读取集中。当线程应该终止时,在管道上发送一个字节。

或者在 select 调用上有一个超时,当它超时时检查终止标志。

【讨论】:

  • 通过添加超时,我增加了线程的开销,为了足够快,我需要每秒唤醒一次......
  • @Mellowcandle 你可能有 1 毫秒的超时,但在 CPU 负载上仍然不会引起注意。
  • ..或者,似乎,只需关闭 fd。单行,没有浪费 CPU 的超时循环或可避免的延迟。
【解决方案2】:

除了 Joachim 提出的温和方法之外,还有一些粗略的方法 “中断”阻塞select()

  • 使用pthread_kill() 向阻塞线程发送信号,并在有问题的select() 之后测试(EINTR == errno)
  • 在线程 ID 上调用 pthread_cancel()select() 属于默认取消点集。

这两种方法都应被视为最后的解决方案。

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多