22#include <condition_variable>
30#define STAT_BENCH_USE_WINDOWS_SYNC_BARRIER 1
32#elif defined(__linux__)
34#define STAT_BENCH_USE_PTHREAD_SYNC_BARRIER 1
51 explicit MutexSyncBarrier(std::size_t num_waiting_threads)
52 : num_waiting_threads_(num_waiting_threads) {
53 if (num_waiting_threads < 2U) {
54 throw StatBenchException(
55 "Invalid number of threads to wait in MutexSyncBarrier.");
62 void wait()
override {
63 std::unique_lock<std::mutex> lock(mutex_);
64 if (num_remaining_threads_ == 0U) {
66 num_remaining_threads_ = num_waiting_threads_ - 1U;
68 lock, [
this] {
return num_remaining_threads_ == 0U; });
69 }
else if (num_remaining_threads_ == 1U) {
71 num_remaining_threads_ = 0U;
73 cond_var_.notify_all();
75 --num_remaining_threads_;
77 lock, [
this] {
return num_remaining_threads_ == 0U; });
81 MutexSyncBarrier(
const MutexSyncBarrier&) =
delete;
82 MutexSyncBarrier(MutexSyncBarrier&&) =
delete;
83 auto operator=(
const MutexSyncBarrier&) =
delete;
84 auto operator=(MutexSyncBarrier&&) =
delete;
87 ~MutexSyncBarrier()
override =
default;
94 std::condition_variable cond_var_{};
97 std::size_t num_waiting_threads_;
100 std::size_t num_remaining_threads_{0};
104 -> std::shared_ptr<ISyncBarrier> {
105 return std::make_shared<MutexSyncBarrier>(num_waiting_threads);
109 -> std::shared_ptr<ISyncBarrier> {
110#if defined(STAT_BENCH_USE_WINDOWS_SYNC_BARRIER)
112#elif defined(STAT_BENCH_USE_PTHREAD_SYNC_BARRIER)
115 using Barrier = MutexSyncBarrier;
117 return std::make_shared<Barrier>(num_waiting_threads);
Interface of barriers to synchronize threads.
Class of barriers to synchronize threads using pthread library.
Class of barriers to synchronize threads using synchronization barriers in Windows.
Namespace of utility functions and classes.
auto create_mutex_sync_barrier(std::size_t num_waiting_threads) -> std::shared_ptr< ISyncBarrier >
Create a barrier to synchronize threads using a mutex.
auto create_sync_barrier(std::size_t num_waiting_threads) -> std::shared_ptr< ISyncBarrier >
Create a barrier to synchronize threads.
Namespace of stat_bench source codes.
Definition of PthreadSyncBarrier class. (Internal header.)
Definition of StatBenchException class.
Definition of SyncBarrier class.
Definition of WindowsSyncBarrier class. (Internal header.)