2014-06-10 170 views
0

我发现这个上SO here等待条件变量

void mrevent_wait(struct mrevent *ev) { 
    pthread_mutex_lock(&ev->mutex); 
    while (!ev->triggered) 
     pthread_cond_wait(&ev->cond, &ev->mutex); 
    pthread_mutex_unlock(&ev->mutex); 
} 

的手册页赛斯:

的调用pthread_cond_wait()和那么pthread_cond_timedwait()函数用于在条件变量阻塞。它们被调用线程锁定的互斥锁调用,否则会导致未定义的行为。

这些函数以原子方式释放互斥锁并导致调用线程在条件变量cond上阻塞;

那么在每次调用pthread_cond_wait之前都不应该捕获互斥锁。另外,为什么在手册页中解释了互斥体,pthread_cond_wait为您做了这些。

回答

0

您正在阅读的文档有点不对。它所说的是,在pthread_cond_wait()的调用中,互斥锁被解锁(这是必需的,否则pthread_cond_signal()pthread_cond_broadcast()将永远不能触发条件变量)。条件变量被触发后,互斥将在pthread_cond_wait()返回之前被重新锁定。这就是你必须再解锁它的原因。

由于pthread_cond_wait()在返回给您之前需要重新获取互斥锁,所以可能有其他线程可能首先获取互斥锁,这意味着到pthread_cond_wait()返回给您时,您等待的条件可能会已经通过了,这就是为什么你必须测试while循环中的条件。