// Copyright Oliver Kowalke 2013. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BARRIER_H #define BARRIER_H #include #include #include #include class barrier { private: std::size_t initial_; std::size_t current_; bool cycle_{ true }; std::mutex mtx_{}; std::condition_variable cond_{}; public: explicit barrier( std::size_t initial) : initial_{ initial }, current_{ initial_ } { BOOST_ASSERT ( 0 != initial); } barrier( barrier const&) = delete; barrier & operator=( barrier const&) = delete; bool wait() { std::unique_lock< std::mutex > lk( mtx_); const bool cycle = cycle_; if ( 0 == --current_) { cycle_ = ! cycle_; current_ = initial_; lk.unlock(); // no pessimization cond_.notify_all(); return true; } else { cond_.wait( lk, [&](){ return cycle != cycle_; }); } return false; } }; #endif // BARRIER_H