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