// Copyright (C) 2002-2003 | |
// David Moore, William E. Kempf | |
// Copyright (C) 2007-8 Anthony Williams | |
// | |
// 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 BOOST_BARRIER_JDM030602_HPP | |
#define BOOST_BARRIER_JDM030602_HPP | |
#include <boost/thread/detail/config.hpp> | |
#include <boost/throw_exception.hpp> | |
#include <boost/thread/mutex.hpp> | |
#include <boost/thread/condition_variable.hpp> | |
#include <string> | |
#include <stdexcept> | |
#include <boost/config/abi_prefix.hpp> | |
namespace boost | |
{ | |
class barrier | |
{ | |
public: | |
barrier(unsigned int count) | |
: m_threshold(count), m_count(count), m_generation(0) | |
{ | |
if (count == 0) | |
boost::throw_exception(std::invalid_argument("count cannot be zero.")); | |
} | |
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; | |
} | |
private: | |
mutex m_mutex; | |
condition_variable m_cond; | |
unsigned int m_threshold; | |
unsigned int m_count; | |
unsigned int m_generation; | |
}; | |
} // namespace boost | |
#include <boost/config/abi_suffix.hpp> | |
#endif |