mirror of
https://github.com/boostorg/fiber.git
synced 2026-02-19 14:22:23 +00:00
51 lines
1.2 KiB
C++
51 lines
1.2 KiB
C++
|
|
// 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 <cstddef>
|
|
#include <condition_variable>
|
|
#include <mutex>
|
|
|
|
#include <boost/assert.hpp>
|
|
|
|
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
|