Mar*_*son 2 c++ multithreading boost boost-thread barrier
boost库(在C++ 11标准之前)提供了对线程的支持.作为其支持的一部分,它还提供了"障碍"的实现,这是一个允许同步的简单类.引用boost网站:
"屏障是一个简单的概念.也称为集合点,它是多个线程之间的同步点.屏障配置为特定数量的线程(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;
}
Run Code Online (Sandbox Code Playgroud)
可以看出,屏障是可重复使用的:一旦建成,它在首次使用后不需要被销毁.
我现在的问题是:变量m_generation是什么?我假设boost库的编写者有理由将其包含在内.每次屏障重置/准备重复使用时它会递增,但到底是什么?它是一个私有变量,因此无法从外部读出.使用wait()函数中的简单内部bool变量可以很容易地解决同样的问题,而不需要私有类变量.
简而言之,m_generation
需要处理虚假的唤醒.
生成计数器与条件变量一起使用,以向在屏障上等待它们可以继续进行的所有线程发出信号:
一旦有m_threshold
线程到达障碍,其生成数量就会增加,并且会发出条件变量信号.这会导致等待的线程(即那些早先到达屏障的线程)从中唤醒m_cond.wait(lock)
.
现在,等待线程可以m_cond.wait(lock)
因其他原因而被唤醒.这是m_generation
进来的地方:如果它已经改变,那么障碍已被重置并且线程可以继续.如果m_generation
仍然包含相同的值,则线程需要返回m_cond.wait(lock)
.
内部有一个自动变量wait()
无法实现这一点,因为每个线程都有自己的实例.