C++ pthread库的条件变量示例
我正在尝试熟悉pthread库。现在我正在阅读关于条件变量(pthread_cond_t)的文章,所以我有一个关于它如何工作的问题 我找到了一些源代码,其中有一个使用pthread_cond_t结构的简单示例(这里回答,那里回答示例4-8)。看起来是这样的:C++ pthread库的条件变量示例,c++,pthreads,deadlock,C++,Pthreads,Deadlock,我正在尝试熟悉pthread库。现在我正在阅读关于条件变量(pthread_cond_t)的文章,所以我有一个关于它如何工作的问题 我找到了一些源代码,其中有一个使用pthread_cond_t结构的简单示例(这里回答,那里回答示例4-8)。看起来是这样的: pthread_mutex_t count_lock; pthread_cond_t count_nonzero; unsigned count; decrement_count() { pthread_mutex_lock(&a
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\u lock对象。我的问题是,为什么它不会导致僵局?
想象一个简单的情况:
提前感谢您的解释 说明该函数将释放互斥锁,并在条件发出信号后自动恢复它。查看
pthread\u conditions\u wait
的文档:[此函数]自动释放互斥锁,并导致调用线程在条件变量cond上阻塞;原子性在这里意味着“原子性地涉及到另一个线程对互斥体的访问,然后是对条件变量的访问”。也就是说,如果另一个线程能够在即将阻止的线程释放互斥对象后获取互斥对象,则随后对该线程中pthread_cond_broadcast()或pthread_cond_signal()的调用应表现为它是在即将阻止的线程被阻止后发出的。