pthread_cancel使用互斥锁时的条件变量

时间:2014-06-21 09:21:01

标签: pthreads

您好我有一个关于取消使用互斥锁和条件变量的线程的问题。该线程具有取消类型延迟。当我只使用函数pthread_mutex_lock / unlock和pthread_cond_wait,并且取消请求到达时,线程的取消点只是pthread_cond_wait。它会锁定互斥锁吗?我不确定,如果线程总是让互斥锁解锁。或者pthread_mutex_lock / unlock函数也是取消点吗?谢谢。

3 个答案:

答案 0 :(得分:2)

我怀疑我可以比the documentation

更好地说出这句话
  

条件等待(无论是否定时)是取消点。什么时候   线程的可取消性类型设置为PTHREAD_CANCEL_DEFERRED,   在a。中对取消请求采取行动的副作用   条件等待是指(实际上)之前重新获取的互斥锁   调用第一个取消清理处理程序。效果就好像   线程被解锁,允许执行到达   从调用返回到pthread_cond_timedwait()或   pthread_cond_wait(),但此时会注意到取消   请求而不是返回给调用者   pthread_cond_timedwait()或pthread_cond_wait()启动线程   取消活动,包括致电取消清理   处理程序。

另外,请确保您知道其他功能也是cancellation points

答案 1 :(得分:0)

如果您有多个线程等待pthread_cond_wait,并且在使用pthread_cancelpthread_cond_broadcast发送某种类型的广播之前致电pthread_cond_signal,则可能会导致死锁,pthread_cond_wait等待线程取消,线程正等待pthread_cond_wait出来。

答案 2 :(得分:0)

每个“ Linux编程接口”书页667-678 互斥锁将被锁定。所以你可以使用

pthread_mutex_lock(&mutex);
pthread_cleanup_push((void (*)(void *))pthread_mutex_unlock, &mutex);
while (var == 0)) {
    pthread_cond_wait(&cond, &mutex);
}
pthread_cleanup_pop(1);