pthread_cond_broadcast背后的原理是什么?

时间:2020-08-15 21:55:59

标签: c++ multithreading concurrency pthreads condition-variable

我正在尝试了解pthread_cond_broadcast方法的实际用例。

到目前为止,我已经找到了两个答案:

  1. 不同的线程可能会在不同的条件下等待,因此您需要唤醒所有线程以查看可以继续执行的线程。
  2. 如果要消耗多个资源,则可以唤醒其中的多个资源以继续操作。

#1很有意义,但是,#2令人困惑。我发现以下代码演示了这种情况。我的问题是,由于唤醒条件变量时,它将获取互斥量,其他线程必须再次进入睡眠状态。那么,唤醒所有人的目的是什么? pthread是否一直保持信号,直到所有线程都有机会至少获取一次互斥锁?在我看来,没有意义,因为只有其中一个可以获取互斥体。

我必须遗漏一点,希望有人可以向我解释。

非常感谢您!

参考:https://docs.oracle.com/cd/E19455-01/806-5257/sync-27/index.html

pthread_mutex_t rsrc_lock;
pthread_cond_t rsrc_add;
unsigned int resources;

get_resources(int amount)
{
    pthread_mutex_lock(&rsrc_lock);
    while (resources < amount) {
        pthread_cond_wait(&rsrc_add, &rsrc_lock);
    }
    resources -= amount;
    pthread_mutex_unlock(&rsrc_lock);
}

add_resources(int amount)
{
    pthread_mutex_lock(&rsrc_lock);
    resources += amount;
    pthread_cond_broadcast(&rsrc_add);
    pthread_mutex_unlock(&rsrc_lock);
}

0 个答案:

没有答案
相关问题