我在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时解锁互斥锁。
答案 0 :(得分:0)
您正在阅读文档略有错误。它的含义是,在pthread_cond_wait()
的调用中,互斥锁被解锁(这是必需的,否则pthread_cond_signal()
或pthread_cond_broadcast()
永远无法触发条件变量) 。触发条件变量后,将在pthread_cond_wait()
返回之前重新锁定互斥锁。这就是你必须再次解锁它的原因。
因为pthread_cond_wait()
需要在返回给你之前重新获取互斥锁,所以有可能不同的线程可以先获取互斥锁,这意味着在pthread_cond_wait()
返回给你的时候,您正在等待的条件可能已经过去,这就是您必须在while
循环中测试条件的原因。