我的主进程发送pthread_cancel
到另一个线程,该线程正在等待cond_wait(&condition)
发生的情况。在他们所说的pthread_cancel
上:延迟取消能力意味着取消将被延迟,直到线程下一次调用作为取消点的函数。但这些函数通常都是阻塞函数。然后我的问题是线程被取消后才被取消(在我的例子中是广播或信号),或者它会看到我当前在取消点上阻塞然后取消了我的线程?
答案 0 :(得分:0)
您可能希望使用pthread_cond_wait而不是cond_wait。
如果您使用pthread_cond_wait并基于此来自man pthread_cond_wait(3)
条件等待(无论是否定时)是取消点。当线程的可取消性启用状态被设置为PTHREAD_CANCEL_DEFERRED时,在条件等待期间对取消请求起作用的副作用是在调用第一取消清除处理程序之前(实际上)重新获取互斥锁。效果就好像线程被解除阻塞,允许执行直到从调用返回pthread_cond_timedwait()或pthread_cond_wait(),但此时注意到取消请求而不是返回到pthread_cond_timedwait()的调用者或者pthread_cond_wait(),启动线程取消活动,包括调用取消清理处理程序。
看起来线程将在pthread_cond_wait上取消,即使它当前被阻止
或者您可以使用pthread_setcanceltype将取消类型设置为ASYNCHRONOUS。请参阅下面的评论
但是和大多数时候一样,最好的方法就是用测试代码来尝试。
答案 1 :(得分:0)
我不熟悉cond_wait
,但我认为它来自另一个库而不是通常使用的pthread_cond_wait
?
但是,是的,如果某个帖子在pthread_cond_wait
中被阻止然后被取消,该线程将被唤醒,重新获取它的互斥锁,然后被取消。
因此,在取消条件阻塞的线程时,请记住以下两点:
在致电pthread_cancel
之前,请确保互斥锁已解锁(或将来某个时候解锁)。例如,如果线程A在条件上等待,并且线程B锁定条件互斥锁,在解锁条件互斥锁之前调用pthread_cancel
然后调用pthread_join
,则会死锁。
安装清理处理程序(请参阅pthread_cleanup_push
)以在调用pthread_cond_wait
之前解锁您的条件互斥锁 - 否则您将取消线程并锁定互斥锁。
但是,请注意pthread条件变量实现已经/有一些错误 - 所以一定要使用最新的glibc。