2016-08-24 178 views
1

我有一个pthread对某些文件描述符进行无限轮询,并带有负超时参数。如何从主线程中优雅地阻塞pthread退出?

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

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

  1. 使用pthread_cancel可以():这是气馁,因为这可能导致不清除任何保留的资源或互斥

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

任何人都可以提出一个优雅的解决方案来解决这个问题吗?

谢谢! ASM

+2

添加一个eventfd到你信号终止的混音? –

+0

这是一个很好的建议。我可以尝试。谢谢! –

回答

5

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

1

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