杀死等待条件变量的pthread

Car*_*Ash 7 c++ pthreads

我有一个pthread使用pthread_cond_wait等待条件变量.它正在等待来自另一个线程填充的队列结构的数据.我想杀死这个帖子,最好没有pthread_kill.在Linux和WinPthreads上做pthread_cancel(); pthread_join()足以杀死它.但是,在OS X上,它挂起在pthread_join调用上.有什么建议?

Ant*_*ams 7

pthread_cancel应该唤醒被阻止的线程pthread_cond_wait---这是必需的取消点之一.如果它不起作用则出现问题.

要检查的第一件事是确实在目标线程上启用了取消---显式调用pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldstate)目标线程以确保.如果这不起作用,那么您的平台上的取消就会被取消,您将不得不采取其他方法,例如设置"请立即停止"标志并发出条件变量信号.

除非你真的知道你在做什么,否则不要使用异步取消- 它可以在任何操作的中间触发取消(例如在设置函数调用堆栈帧或运行析构函数的过程中),因此可以离开您的代码处于完全不一致的状态.编写异步取消安全代码很难.

顺便说一句pthread_kill,不会杀死一个线程---它会向它发送一个信号.


Buk*_*kes 7

您是否可以访问队列,并控制入队项目的对象架构?如果是这样,请定义一个队列对象类型,在排队时指示正在处理项目的线程正常退出.

现在,要关闭这些线程,只需将一些这些"退出"对象发布到队列的HEAD,该HEAD对应于为队列提供服务的线程数,并加入线程.

这似乎比pthread_cancel/kill的"核选项"更清晰.