我有一个pthread,它对一些文件描述符进行无限期轮询,并带有负超时参数。
从主线程中,我希望能够向轮询线程表明它应该退出。
我做了一些研究,发现了以下方法:
使用pthread_cancel():不鼓励这样做,因为它可能会导致无法清除任何持有的资源或互斥锁的意外后果
使用变量作为标志并在主线程中设置它。轮询线程每次迭代都会检查此标志,如果设置,则通过调用pthread_exit()退出。这种方法不起作用,因为我的轮询线程没有循环,只是无限期地阻塞,等待文件描述符。
有人能为这个问题提出一个优雅的解决方案吗?
谢谢! ASM
答案 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
。别忘了为你发送的信号设置处理程序。