我在Linux中使用pthread实现手动重置事件,类似于Windows中的WaitForSingleEvent。我找到了这篇文章
pthread-like windows manual-reset event
并遵循它,但有一件事让我困惑:
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_mutex_unlock可能会出现未定义的行为(这种事情会让我发疯,为什么他们不会处理它:-D)
谢谢。
答案 0 :(得分:9)
成功返回后,互斥锁有 被锁定并归其所有 调用线程。
这意味着返回时,pthread_cond_wait
原子会锁定关联的互斥锁。
工作流程如下:
pthread_cond_wait
以原子方式阻止和解锁互斥锁(因此其他线程可能会到达此处)pthread_cond_wait
以原子方式返回并锁定互斥锁我认为pthread_cond_wait不会阻止 和解锁
那是因为你没有看到我提供的链接。
这些函数原子释放 互斥并导致调用线程 阻止条件变量cond;