14 explicit ThreadManager(
int num_threads)
15 : alive_threads_(num_threads), start_stop_barrier_(num_threads) {}
17 Mutex& GetBenchmarkMutex()
const RETURN_CAPABILITY(benchmark_mutex_) {
18 return benchmark_mutex_;
21 bool StartStopBarrier() EXCLUDES(end_cond_mutex_) {
22 return start_stop_barrier_.wait();
25 void NotifyThreadComplete() EXCLUDES(end_cond_mutex_) {
26 start_stop_barrier_.removeThread();
27 if (--alive_threads_ == 0) {
29 end_condition_.notify_all();
33 void WaitForAllThreads() EXCLUDES(end_cond_mutex_) {
35 end_condition_.wait(lock.native_handle(),
36 [
this]() { return alive_threads_ == 0; });
40 IterationCount iterations = 0;
41 double real_time_used = 0;
42 double cpu_time_used = 0;
43 double manual_time_used = 0;
44 int64_t complexity_n = 0;
45 std::string report_label_;
46 std::string skip_message_;
47 internal::Skipped skipped_ = internal::NotSkipped;
48 UserCounters counters;
50 GUARDED_BY(GetBenchmarkMutex())
Result results;
53 mutable Mutex benchmark_mutex_;
54 std::atomic<
int> alive_threads_;
56 Mutex end_cond_mutex_;
57 Condition end_condition_;