Program Listing for File ParallelBarrier.hpp¶
↰ Return to documentation for file (include/uitsl/parallel/ParallelBarrier.hpp)
#pragma once
#ifndef UITSL_PARALLEL_PARALLELBARRIER_HPP_INCLUDE
#define UITSL_PARALLEL_PARALLELBARRIER_HPP_INCLUDE
#include <atomic>
#include "../countdown/Timer.hpp"
#include "ThreadIbarrier.hpp"
namespace uitsl {
class ParallelBarrier {
size_t expected;
std::atomic<size_t> missing;
std::atomic<size_t> generation{};
public:
ParallelBarrier(
const size_t expected_
) : expected(expected_), missing(expected_) {
}
void ArriveAndWait() {
ArriveAndWaitWhile( uitsl::CoarseTimer{ uitsl::infinite_duration } );
}
template<typename Timer>
void ArriveAndWaitWhile(const Timer& timer) {
const size_t my_generation = generation;
if (!--missing) {
missing = expected;
++generation;
} else while (generation == my_generation && !timer.IsComplete());
}
};
} // namespace uitsl
#endif // #ifndef UITSL_PARALLEL_PARALLELBARRIER_HPP_INCLUDE