我有一个pthread使用pthread_cond_wait等待条件变量.它正在等待来自另一个线程填充的队列结构的数据.我想杀死这个帖子,最好没有pthread_kill.在Linux和WinPthreads上做pthread_cancel(); pthread_join()足以杀死它.但是,在OS X上,它挂起在pthread_join调用上.有什么建议?
pthread_cancel应该唤醒被阻止的线程pthread_cond_wait---这是必需的取消点之一.如果它不起作用则出现问题.
要检查的第一件事是确实在目标线程上启用了取消---显式调用pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldstate)目标线程以确保.如果这不起作用,那么您的平台上的取消就会被取消,您将不得不采取其他方法,例如设置"请立即停止"标志并发出条件变量信号.
除非你真的知道你在做什么,否则不要使用异步取消- 它可以在任何操作的中间触发取消(例如在设置函数调用堆栈帧或运行析构函数的过程中),因此可以离开您的代码处于完全不一致的状态.编写异步取消安全代码很难.
顺便说一句pthread_kill,不会杀死一个线程---它会向它发送一个信号.
您是否可以访问队列,并控制入队项目的对象架构?如果是这样,请定义一个队列对象类型,在排队时指示正在处理项目的线程正常退出.
现在,要关闭这些线程,只需将一些这些"退出"对象发布到队列的HEAD,该HEAD对应于为队列提供服务的线程数,并加入线程.
这似乎比pthread_cancel/kill的"核选项"更清晰.
| 归档时间: |
|
| 查看次数: |
5669 次 |
| 最近记录: |