【问题标题】:How do I wait for a pthread condition variable or a signal?如何等待 pthread 条件变量或信号?
【发布时间】:2018-02-07 03:42:12
【问题描述】:

我想等待一个 pthread 条件变量,但是当我得到一个 SIGUSR1(或任何其他信号)时,我想停止等待并检测它是否因为信号而停止等待,而不是因为 pthread_cond_signal 或虚假唤醒。我该怎么做?

【问题讨论】:

  • @alk pthread_cond_wait 和 pthread_cond_timedwait 的手册页说“这些函数不应返回 [EINTR] 的错误代码。”
  • 看起来您可能需要使用辅助线程(用于捕获信号或等待条件变量)。实际上,要关闭所有比赛,您可能必须使用两个辅助线程和一个信号量,而原始线程在信号量上等待。

标签: c pthreads signals posix


【解决方案1】:

在 pthreads 程序中处理信号的一种可靠方法是屏蔽您希望在每个线程中处理的所有信号,并创建一个专用的信号处理线程来循环调用 sigwaitinfo()(或 sigtimedwait())。

然后,信号处理线程可以使用普通的互斥保护共享变量和pthread_cond_signal() / pthread_cond_broadcast() 唤醒来通知其他线程收到的信号。

在您的示例中,专用信号处理线程可以设置一个(互斥保护)标志,指示已收到SIGUSR1,然后发出您的线程正在等待的条件变量的信号。等待线程只需要检查信号标志以及它在pthread_cond_wait() 周围的循环中的其他共享状态。

【讨论】:

  • 线程可能正在等待程序中的任何条件变量,所以我不能只从信号处理程序发出线程正在等待的条件变量。我可以在 pthread_cond_wait 周围使用一个包装函数,将条件保存在信号处理程序的线程本地中,但这很难防止竞争条件,例如如果信号到达并且处理程序在本地存储线程和开始等待之间运行 pthread_cond_broadcast。
  • 应该始终清楚您的线程可以等待哪些条件变量。如果有多种可能性,您可以全部发出信号(条件变量无论如何都可能被虚假唤醒,因此不必要地发出信号总是安全的)。 (此外,这里的想法不是从信号处理程序调用pthread_cond_broadcast(),而是从在普通线程上下文中运行的信号处理线程调用,在sigwaitinfo() 返回并出列信号之后)。
猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多