@@ -88,23 +88,23 @@ struct Deque {
8888 Deque () : bot(0 ), age(age_t {0 , 0 }) {}
8989
9090 void push_bottom (Job* job) {
91- auto local_bot = bot.load (std::memory_order_relaxed ); // atomic load
92- deq[local_bot].job .store (job, std::memory_order_relaxed ); // shared store
91+ auto local_bot = bot.load (std::memory_order_acquire ); // atomic load
92+ deq[local_bot].job .store (job, std::memory_order_release ); // shared store
9393 local_bot += 1 ;
9494 if (local_bot == q_size) {
9595 throw std::runtime_error (" internal error: scheduler queue overflow" );
9696 }
97- bot.store (local_bot, std::memory_order_relaxed ); // shared store
97+ bot.store (local_bot, std::memory_order_release ); // shared store
9898 std::atomic_thread_fence (std::memory_order_seq_cst);
9999 }
100100
101101 Job* pop_top () {
102102 Job* result = nullptr ;
103- auto old_age = age.load (std::memory_order_relaxed ); // atomic load
104- auto local_bot = bot.load (std::memory_order_relaxed ); // atomic load
103+ auto old_age = age.load (std::memory_order_acquire ); // atomic load
104+ auto local_bot = bot.load (std::memory_order_acquire ); // atomic load
105105 if (local_bot > old_age.top ) {
106106 auto job =
107- deq[old_age.top ].job .load (std::memory_order_relaxed ); // atomic load
107+ deq[old_age.top ].job .load (std::memory_order_acquire ); // atomic load
108108 auto new_age = old_age;
109109 new_age.top = new_age.top + 1 ;
110110 if (age.compare_exchange_strong (old_age, new_age))
@@ -117,24 +117,24 @@ struct Deque {
117117
118118 Job* pop_bottom () {
119119 Job* result = nullptr ;
120- auto local_bot = bot.load (std::memory_order_relaxed ); // atomic load
120+ auto local_bot = bot.load (std::memory_order_acquire ); // atomic load
121121 if (local_bot != 0 ) {
122122 local_bot--;
123- bot.store (local_bot, std::memory_order_relaxed ); // shared store
123+ bot.store (local_bot, std::memory_order_release ); // shared store
124124 std::atomic_thread_fence (std::memory_order_seq_cst);
125125 auto job =
126- deq[local_bot].job .load (std::memory_order_relaxed ); // atomic load
127- auto old_age = age.load (std::memory_order_relaxed ); // atomic load
126+ deq[local_bot].job .load (std::memory_order_acquire ); // atomic load
127+ auto old_age = age.load (std::memory_order_acquire ); // atomic load
128128 if (local_bot > old_age.top )
129129 result = job;
130130 else {
131- bot.store (0 , std::memory_order_relaxed ); // shared store
131+ bot.store (0 , std::memory_order_release ); // shared store
132132 auto new_age = age_t {old_age.tag + 1 , 0 };
133133 if ((local_bot == old_age.top ) &&
134134 age.compare_exchange_strong (old_age, new_age))
135135 result = job;
136136 else {
137- age.store (new_age, std::memory_order_relaxed ); // shared store
137+ age.store (new_age, std::memory_order_release ); // shared store
138138 result = nullptr ;
139139 }
140140 std::atomic_thread_fence (std::memory_order_seq_cst);
@@ -246,7 +246,7 @@ struct scheduler {
246246 std::vector<Deque<Job>> deques;
247247 std::vector<attempt> attempts;
248248 std::vector<std::thread> spawned_threads;
249- std::atomic<int > finished_flag;
249+ std::atomic<bool > finished_flag;
250250
251251 // Start an individual scheduler task. Runs until finished().
252252 template <typename F>
0 commit comments