15

什么是boost:barrier,如何使用这种boost方式。你能给我一个清楚的例子吗,因为我找到了以下例子:

    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_cond.notify_all();是进入其他等待线程吗?你能清楚地告诉我屏障功能吗?谢谢你。

4

1 回答 1

16

notify_all,通知等待线程。

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

简单的例子。只有当 3 个线程调用屏障上的等待函数时,才会输出当前值。

#include <boost/thread.hpp>
#include <boost/thread/barrier.hpp>
#include <boost/bind.hpp>
#include <boost/atomic.hpp>

boost::mutex io_mutex;

void thread_fun(boost::barrier& cur_barier, boost::atomic<int>& current)
{
    ++current;
    cur_barier.wait();
    boost::lock_guard<boost::mutex> locker(io_mutex);
    std::cout << current << std::endl;
}

int main()
{
    boost::barrier bar(3);
    boost::atomic<int> current(0);
    boost::thread thr1(boost::bind(&thread_fun, boost::ref(bar), boost::ref(current)));
    boost::thread thr2(boost::bind(&thread_fun, boost::ref(bar), boost::ref(current)));
    boost::thread thr3(boost::bind(&thread_fun, boost::ref(bar), boost::ref(current)));
    thr1.join();
    thr2.join();
    thr3.join();
}
于 2012-07-10T06:58:17.543 回答