Подтвердить что ты не робот

Как использовать повышающий барьер

Что такое 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(); заключается в том, чтобы вводить другие ожидающие потоки? Не могли бы вы рассказать мне о барьерной функциональности? Спасибо.

4b9b3361

Ответ 1

notify_all, уведомленный о ожидающих потоках.

Барьер - это простое понятие. Также известный как рандеву, это точка синхронизации между несколькими потоками. Барьер настроен для определенного количества потоков (n) и как потоки дойти до барьера, он должен подождать, пока не появятся все нити. Как только n-й поток достиг барьера, все ожидающие потоки может продолжаться, а барьер reset.

Простой пример. значение тока будет выводиться только тогда, когда 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();
}