我正在尝试熟悉 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 对象。我的问题是为什么它不会导致僵局? 想象一个简单的情况:
- 计数为零
- decrement_count 被调用,现在 count_lock 被锁定
- count_lock 将在 count 大于零时解锁
- increment_lock 被调用但由于 count_lock 被锁定而被阻塞
- 僵局 ???
提前感谢您的任何解释!
最佳答案
1st google result for pthread_cond_wait
说明该函数将释放对互斥锁的锁定,并在发出条件信号后自动恢复它。
关于c++ - pthread 库的条件变量示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349480/