【问题标题】:Waiting on condition variable等待条件变量
【发布时间】:2014-06-10 19:17:05
【问题描述】:

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

手册页是:

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

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

那么不应该在每次调用pthread_cond_wait 之前捕获互斥锁。另外,当手册页说 pthread_cond_wait 为您执行此操作时,为什么互斥锁会解锁。

【问题讨论】:

    标签: multithreading synchronization condition-variable


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2021-08-23
      相关资源
      最近更新 更多