You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
64 lines
1.5 KiB
64 lines
1.5 KiB
// 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
|
|
|