pthread库的条件变量示例

时间:2014-12-08 00:11:31

标签: c++ pthreads deadlock

我正在尝试熟悉pthread库。现在我正在阅读条件变量(pthread_cond_t),所以我对它是如何工作有疑问。

我找到了一些使用pthread_cond_t结构的简单示例的源代码(在这里回答https://stackoverflow.com/a/525841/3008684,在那里回答示例4-8 https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032r/index.html)。它看起来像这样:

pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;

decrement_count()
{
    pthread_mutex_lock(&count_lock);
    while (count == 0)
        pthread_cond_wait(&count_nonzero, &count_lock);
    count = count - 1;
    pthread_mutex_unlock(&count_lock);
}

increment_count()
{
    pthread_mutex_lock(&count_lock);
    if (count == 0)
        pthread_cond_signal(&count_nonzero);
    count = count + 1;
    pthread_mutex_unlock(&count_lock);
}

正如您在两种方法中看到的那样,使用相同的count_lock对象。我的问题是为什么它不会导致僵局? 想象一下一个简单的情况:

  1. count等于零
  2. dowment_count被调用,现在count_lock被锁定
  3. 如果count大于零,
  4. count_lock将被解锁
  5. 在当前锁定count_lock时,会调用increment_lock但阻止
  6. 死锁???
  7. 提前感谢任何解释!

1 个答案:

答案 0 :(得分:0)

1st google result for pthread_cond_wait解释说该函数将解除对互斥锁的锁定,并在发出条件信号后自动恢复它。