Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ pthread库的条件变量示例_C++_Pthreads_Deadlock - Fatal编程技术网

C++ pthread库的条件变量示例

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库。现在我正在阅读关于条件变量(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(&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()的调用应表现为它是在即将阻止的线程被阻止后发出的。