pthread_cond_wait和pthread_mutex_unlock会发生冲突吗?

lon*_*kit 3 c++ multithreading pthreads

我在Linux中使用pthread实现手动重置事件,类似于Windows中的WaitForSingleEvent.我找到了这篇文章

pthread-like windows手动重置事件

并遵循它,但有一件事让我困惑:

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);
}
Run Code Online (Sandbox Code Playgroud)
  • pthread_cond_wait:以原子方式释放互斥锁并导致调用线程阻塞条件变量cond;
  • pthread_mutex_unlock:尝试解锁指定的互斥锁.如果互斥锁类型为PTHREAD_MUTEX_NORMAL,则不提供错误检测.如果某个线程尝试解锁未锁定的互斥或解锁的互斥锁,则会导致未定义的行为.

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

谢谢.

cni*_*tar 9

标准说:

成功返回后,互斥锁已被锁定并由调用线程拥有.

这意味着返回时,pthread_cond_wait 原子锁定相关的互斥锁.

工作流程如下:

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

我不认为pthread_cond_wait阻止和解锁

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

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