15

boost:barrierとは、この種のブースト方法の使用方法です。次の例を見つけたので、明確な例を教えてください。

    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 に答える