等待条件变量

时间:2014-06-10 19:17:05

标签: multithreading synchronization condition-variable

我在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);
}

manpage sais:

  

pthread_cond_wait()和pthread_cond_timedwait()函数用于阻止条件变量。它们是由调用线程锁定的互斥锁调用的,否则将导致未定义的行为。

     

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

然后,在每次调用pthread_cond_wait之前,不应该捕获互斥锁。另外,为什么在pthread_cond_wait为你做的那个manpage sais时解锁互斥锁。

1 个答案:

答案 0 :(得分:0)

您正在阅读文档略有错误。它的含义是,在pthread_cond_wait()的调用中,互斥锁被解锁(这是必需的,否则pthread_cond_signal()pthread_cond_broadcast()永远无法触发条件变量) 。触发条件变量后,将在pthread_cond_wait()返回之前重新锁定互斥锁。这就是你必须再次解锁它的原因。

因为pthread_cond_wait()需要在返回给你之前重新获取互斥锁,所以有可能不同的线程可以先获取互斥锁,这意味着在pthread_cond_wait()返回给你的时候,您正在等待的条件可能已经过去,这就是您必须在while循环中测试条件的原因。