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