如何优雅地从主线程中阻止pthread退出?

时间:2016-08-24 00:30:56

标签: c multithreading pthreads blocking

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

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

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

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

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

  3. 有人能为这个问题提出一个优雅的解决方案吗?

    谢谢! ASM

2 个答案:

答案 0 :(得分:5)

您可以使用proxy_set_header X-Forwarded-Proto $scheme;创建一个匿名管道,并让文件描述符监视线程将读取端添加到其轮询文件描述符中,当该文件描述符报告EOF时退出。然后主线程在它想要线程退出时关闭写端。

答案 1 :(得分:1)

您可以使用 ['start_date','required','when'=>function($model) { return $model->end_date != ''; }] 向阻止线程发送信号(例如SIGUSR1)。然后,pthread_kill()调用应返回一个负值,并将select设置为errno。别忘了为你发送的信号设置处理程序。