c++ - pthread 库的条件变量示例

标签 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. 计数为零
  2. decrement_count 被调用,现在 count_lock 被锁定
  3. count_lock 将在 count 大于零时解锁
  4. increment_lock 被调用但由于 count_lock 被锁定而被阻塞
  5. 僵局 ???

提前感谢您的任何解释!

最佳答案

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

关于c++ - pthread 库的条件变量示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349480/

相关文章:

c++ - 使用构造函数中本地声明的 device_vector 中的 device_vector::data() 方法初始化结构内部的指针是否安全?

c++ - 那么是什么将 emplace(c.end(),_1) 与 emplace_back(_1) 区分开来呢?

c - 用于 RaceCondition 控制的 Pthreads 和 Mutexes

c - 我怎样才能阻塞线程直到找到素数,解除阻塞,然后让它们等到下一个素数?

Java:如何读取锁定的线程转储

java - 单个java信号量上的死锁?

c++ - 创建自定义 QT 库

c++ - 函数异常规范和标准异常 - foo() throw(Exception)

c - 使用pthread执行矩阵乘法

sql - 选择查询的事务死锁