|
23 | 23 | constexpr int num_waiters = 8; |
24 | 24 | constexpr int num_iterations = 10'000; |
25 | 25 |
|
26 | | -void wait(std::atomic<int>& waiter_ready, const std::atomic<int>& state) { |
27 | | - for (int i = 0; i < num_iterations; ++i) { |
28 | | - auto old_state = state.load(std::memory_order_acquire); |
29 | | - waiter_ready.fetch_add(1, std::memory_order_acq_rel); |
30 | | - state.wait(old_state, std::memory_order_acquire); |
31 | | - } |
32 | | -} |
33 | | - |
34 | | -void notify(std::atomic<int>& waiter_ready, std::atomic<int>& state) { |
35 | | - for (int i = 0; i < num_iterations; ++i) { |
36 | | - while (waiter_ready.load(std::memory_order_acquire) < num_waiters) { |
37 | | - std::this_thread::yield(); |
38 | | - } |
39 | | - waiter_ready.store(0, std::memory_order_release); |
40 | | - state.fetch_add(1, std::memory_order_acq_rel); |
41 | | - state.notify_all(); |
42 | | - } |
43 | | -} |
44 | | - |
45 | 26 | int main(int, char**) { |
46 | 27 | for (int run = 0; run < 20; ++run) { |
47 | 28 | std::atomic<int> waiter_ready(0); |
48 | 29 | std::atomic<int> state(0); |
| 30 | + |
| 31 | + auto wait = [&]() { |
| 32 | + for (int i = 0; i < num_iterations; ++i) { |
| 33 | + auto old_state = state.load(std::memory_order_acquire); |
| 34 | + waiter_ready.fetch_add(1, std::memory_order_acq_rel); |
| 35 | + state.wait(old_state, std::memory_order_acquire); |
| 36 | + } |
| 37 | + }; |
| 38 | + |
| 39 | + auto notify = [&] { |
| 40 | + for (int i = 0; i < num_iterations; ++i) { |
| 41 | + while (waiter_ready.load(std::memory_order_acquire) < num_waiters) { |
| 42 | + std::this_thread::yield(); |
| 43 | + } |
| 44 | + waiter_ready.store(0, std::memory_order_release); |
| 45 | + state.fetch_add(1, std::memory_order_acq_rel); |
| 46 | + state.notify_all(); |
| 47 | + } |
| 48 | + }; |
| 49 | + |
49 | 50 | std::vector<std::jthread> threads; |
50 | | - for (int i = 0; i < 8; ++i) |
51 | | - threads.push_back(support::make_test_jthread(wait, std::ref(waiter_ready), std::cref(state))); |
| 51 | + for (int i = 0; i < num_waiters; ++i) |
| 52 | + threads.push_back(support::make_test_jthread(wait)); |
52 | 53 |
|
53 | | - threads.push_back(support::make_test_jthread(notify, std::ref(waiter_ready), std::ref(state))); |
| 54 | + threads.push_back(support::make_test_jthread(notify)); |
54 | 55 | } |
55 | 56 |
|
56 | 57 | return 0; |
|
0 commit comments