我的主进程将pthread_cancel发送到另一个线程,该线程等待cond_wait(&condition)出现条件。在pthread_cancel上,他们说:延迟取消能力意味着取消将被延迟,直到线程下一次调用作为取消点的函数。但这些函数通常是阻塞函数。那么我的问题是,只有在线程解除阻塞(在我的例子中是广播或信号)之后,线程才被取消,或者它会看到我正在取消点上阻塞,然后取消我的线程?
发布于 2013-03-26 17:50:04
我不太熟悉cond_wait,但我认为它来自另一个库,而不是通常使用的pthread_cond_wait
但是是的,如果一个线程在pthread_cond_wait中被阻塞,然后被取消,这个线程将被唤醒,重新获取它的互斥,然后被取消。
因此,在取消在某个条件下被阻塞的线程时,这里有两点需要记住:
pthread_cancel之前,确保互斥锁被解锁(或者在将来的某个时候被解锁)。例如,如果线程A在等待条件,而线程B锁定条件互斥体,在打开条件互斥锁之前调用pthread_cancel,然后调用pthread_join,那么您将死锁。pthread_cleanup_push),在调用pthread_cond_wait之前解除条件互斥锁-否则您将取消线程并使互斥锁。但是,还要注意的是,p线程条件变量实现有/有一些bug,所以一定要使用最新的glibc。
https://stackoverflow.com/questions/15641145
复制相似问题