Files
concurrency-in-action/source/listing_8.12.cpp
2018-10-18 00:40:34 -05:00

23 lines
440 B
C++

class barrier {
unsigned const count;
std::atomic<unsigned> spaces;
std::atomic<unsigned> generation;
public:
explicit barrier(unsigned count_)
: count(count_), spaces(count), generation(0)
{
}
void wait()
{
unsigned const my_generation = generation;
if (!--spaces) {
spaces = count;
++generation;
}
else {
while (generation == my_generation) std::this_thread::yield();
}
}
};