3 class spinning_barrier {
5 spinning_barrier (unsigned int n) : n_ (n) {
11 unsigned int step = step_.load ();
13 if (nwait_.fetch_add (1) == n_ - 1) {
14 /* OK, last thread to come. */
15 nwait_.store (0); // XXX: maybe can use relaxed ordering here ??
19 /* Run in circles and scream like a little girl. */
20 while (step_.load () == step)
27 /* Number of synchronized threads. */
28 const unsigned int n_;
30 /* Number of threads currently spinning. */
31 std::atomic<unsigned int> nwait_;
33 /* Number of barrier syncronizations completed so far,
34 * * it's OK to wrap. */
35 std::atomic<unsigned int> step_;