pthread_cond_wait和pthread_mutex_unlock会发生冲突吗?

时间:2011-06-30 09:33:22

标签: c++ multithreading pthreads

我在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: 原子释放互斥锁并导致调用线程阻塞条件变量cond;
  • 调用pthread_mutex_unlock: 尝试解锁指定的互斥锁。如果互斥锁类型为PTHREAD_MUTEX_NORMAL,则不提供错误检测。如果某个主题尝试解锁未锁定的互斥锁或解锁的互斥锁,则会导致未定义的行为。

我害怕的是当pthread_cond_wait释放互斥锁时,然后pthread_mutex_unlock可能会出现未定义的行为(这种事情会让我发疯,为什么他们不会处理它:-D)

谢谢。

1 个答案:

答案 0 :(得分:9)

The standard说:

  

成功返回后,互斥锁有   被锁定并归其所有   调用线程。

这意味着返回时,pthread_cond_wait 原子会锁定关联的互斥锁。

工作流程如下:

  • 您锁定互斥锁
    • pthread_cond_wait以原子方式阻止和解锁互斥锁(因此其他线程可能会到达此处)
    • 当条件到达时,pthread_cond_wait以原子方式返回并锁定互斥锁
  • 解锁互斥锁
  

我认为pthread_cond_wait不会阻止   和解锁

那是因为你没有看到我提供的链接。

  

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