【问题标题】:How to gracefully make a blocking pthread exit from the main thread?如何优雅地使阻塞 pthread 从主线程退出?
【发布时间】:2016-08-24 00:30:55
【问题描述】:

我有一个 pthread 对某些文件描述符进行无限轮询,超时参数为负。

从主线程,我希望能够向轮询线程指示它应该退出。

我做了一些研究,发现了以下方法:

  1. 使用 pthread_cancel():不鼓励这样做,因为它可能会导致不清除任何持有的资源或互斥体的意外后果

  2. 使用变量作为标志并在主线程中设置。轮询线程在每次迭代时检查此标志,如果设置,则通过调用 pthread_exit() 退出。这种方法行不通,因为我的轮询线程不会循环,而只是无限期地阻塞,等待文件描述符。

谁能为这个问题提出一个优雅的解决方案?

谢谢! ASM

【问题讨论】:

  • 将 eventfd 添加到您发出终止信号的混音中?
  • 这是一个不错的建议。我可以试试。谢谢!

标签: c multithreading pthreads blocking


【解决方案1】:

您可以使用pipe(2) 创建一个匿名管道,并让文件描述符监视线程将读取端添加到其轮询的文件描述符中,并在该文件描述符报告 EOF 时退出。然后,主线程在它希望线程退出时关闭写入端。

【讨论】:

    【解决方案2】:

    您可以使用pthread_kill() 向阻塞线程发送信号(例如SIGUSR1)。然后select 调用应该返回一个负值并将errno 设置为EINTR。不要忘记为您发送的信号设置处理程序。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多