为什么Boost库在其线程障碍的实现中使用m_generation变量?

时间:2014-10-04 07:56:45

标签: c++ multithreading boost boost-thread barrier

boost库(在C ++ 11标准之前)提供了对线程的支持。作为其支持的一部分,它还提供了“障碍”的实现,这是一个允许同步的简单类。引用boost website

“屏障是一个简单的概念。也称为集合点,它是多个线程之间的同步点。屏障配置为特定数量的线程(n),当线程到达屏障时,它们必须等到所有n个线程都已到达。一旦第n个线程到达屏障,所有等待的线程都可以继续,并且屏障被重置。“

如Boost 1.54所示,屏障(等待)的主要功能的实现如下所示:

bool wait()
{
    boost::mutex::scoped_lock lock(m_mutex);
    unsigned int gen = m_generation;

    if (--m_count == 0)
    {
        m_generation++;
        m_count = m_threshold;
        m_cond.notify_all();
        return true;
    }

    while (gen == m_generation)
        m_cond.wait(lock);
    return false;
}

可以看出屏障是可重复使用的:一旦建成,它在首次使用后不需要被销毁。

我现在的问题是:变量m_generation是什么?我假设boost库的编写者有理由将其包含在内。每次屏障重置/准备重复使用时它会递增,但到底是什么?它是一个私有变量,因此无法从外部读出。使用wait()函数中的简单内部bool变量可以很容易地解决同样的问题,而不需要私有类变量。

1 个答案:

答案 0 :(得分:5)

简而言之,m_generation需要处理m_threshold

生成计数器与条件变量一起使用,以向在屏障上等待它们可以继续的所有线程发出信号:

  • 一旦有m_cond.wait(lock)个线程到达屏障,其生成数就会增加,并且会发出条件变量信号。这导致等待线程(即那些早先到达屏障的线程)从m_cond.wait(lock)唤醒。

  • 现在,等待线程可以从m_generation spurious wakeups唤醒。这是m_generation的来源:如果它被更改,则屏障已被重置,线程可以继续。如果m_cond.wait(lock)仍然包含相同的值,则该主题需要返回wait()

在{{1}}内部有一个自动变量无法实现这一点,因为每个线程都有自己的实例。