@@ -103,7 +103,7 @@ template< typename T > class circular_queue
103103 m_bufSize = cap + 1 ;
104104 std::atomic_thread_fence (std::memory_order_release);
105105 m_inPos.store (available, std::memory_order_relaxed);
106- m_outPos.store (0 , std::memory_order_relaxed );
106+ m_outPos.store (0 , std::memory_order_release );
107107 return true ;
108108 }
109109
@@ -142,7 +142,7 @@ template< typename T > class circular_queue
142142 */
143143 T peek () const
144144 {
145- const auto outPos = m_outPos.load (std::memory_order_relaxed );
145+ const auto outPos = m_outPos.load (std::memory_order_acquire );
146146 const auto inPos = m_inPos.load (std::memory_order_relaxed);
147147 std::atomic_thread_fence (std::memory_order_acquire);
148148 if (inPos == outPos) return defaultValue;
@@ -156,7 +156,7 @@ template< typename T > class circular_queue
156156 */
157157 bool IRAM_ATTR push (T&& val)
158158 {
159- const auto inPos = m_inPos.load (std::memory_order_relaxed );
159+ const auto inPos = m_inPos.load (std::memory_order_acquire );
160160 const unsigned next = (inPos + 1 ) % m_bufSize;
161161 if (next == m_outPos.load (std::memory_order_relaxed)) {
162162 return false ;
@@ -168,7 +168,7 @@ template< typename T > class circular_queue
168168
169169 std::atomic_thread_fence (std::memory_order_release);
170170
171- m_inPos.store (next, std::memory_order_relaxed );
171+ m_inPos.store (next, std::memory_order_release );
172172 return true ;
173173 }
174174
@@ -190,7 +190,7 @@ template< typename T > class circular_queue
190190 */
191191 size_t push_n (const T* buffer, size_t size)
192192 {
193- const auto inPos = m_inPos.load (std::memory_order_relaxed );
193+ const auto inPos = m_inPos.load (std::memory_order_acquire );
194194 const auto outPos = m_outPos.load (std::memory_order_relaxed);
195195
196196 size_t blockSize = (outPos > inPos) ? outPos - 1 - inPos : (outPos == 0 ) ? m_bufSize - 1 - inPos : m_bufSize - inPos;
@@ -209,7 +209,7 @@ template< typename T > class circular_queue
209209
210210 std::atomic_thread_fence (std::memory_order_release);
211211
212- m_inPos.store (next, std::memory_order_relaxed );
212+ m_inPos.store (next, std::memory_order_release );
213213 return blockSize + size;
214214 }
215215
@@ -220,7 +220,7 @@ template< typename T > class circular_queue
220220 */
221221 T pop ()
222222 {
223- const auto outPos = m_outPos.load (std::memory_order_relaxed );
223+ const auto outPos = m_outPos.load (std::memory_order_acquire );
224224 if (m_inPos.load (std::memory_order_relaxed) == outPos) return defaultValue;
225225
226226 std::atomic_thread_fence (std::memory_order_acquire);
@@ -229,7 +229,7 @@ template< typename T > class circular_queue
229229
230230 std::atomic_thread_fence (std::memory_order_release);
231231
232- m_outPos.store ((outPos + 1 ) % m_bufSize, std::memory_order_relaxed );
232+ m_outPos.store ((outPos + 1 ) % m_bufSize, std::memory_order_release );
233233 return val;
234234 }
235235
@@ -241,7 +241,7 @@ template< typename T > class circular_queue
241241 size_t pop_n (T* buffer, size_t size) {
242242 size_t avail = size = std::min (size, available ());
243243 if (!avail) return 0 ;
244- const auto outPos = m_outPos.load (std::memory_order_relaxed );
244+ const auto outPos = m_outPos.load (std::memory_order_acquire );
245245 size_t n = std::min (avail, static_cast <size_t >(m_bufSize - outPos));
246246
247247 std::atomic_thread_fence (std::memory_order_acquire);
@@ -252,7 +252,7 @@ template< typename T > class circular_queue
252252
253253 std::atomic_thread_fence (std::memory_order_release);
254254
255- m_outPos.store ((outPos + size) % m_bufSize, std::memory_order_relaxed );
255+ m_outPos.store ((outPos + size) % m_bufSize, std::memory_order_release );
256256 return size;
257257 }
258258
@@ -262,15 +262,15 @@ template< typename T > class circular_queue
262262 */
263263 void for_each (std::function<void (T&&)> fun)
264264 {
265- auto outPos = m_outPos.load (std::memory_order_relaxed );
265+ auto outPos = m_outPos.load (std::memory_order_acquire );
266266 const auto inPos = m_inPos.load (std::memory_order_relaxed);
267267 std::atomic_thread_fence (std::memory_order_acquire);
268268 while (outPos != inPos)
269269 {
270270 fun (std::move (m_buffer[outPos]));
271271 std::atomic_thread_fence (std::memory_order_release);
272272 outPos = (outPos + 1 ) % m_bufSize;
273- m_outPos.store (outPos, std::memory_order_relaxed );
273+ m_outPos.store (outPos, std::memory_order_release );
274274 }
275275 }
276276
@@ -379,16 +379,15 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
379379#else
380380 std::lock_guard<std::mutex> lock (m_pushMtx);
381381#endif
382- std::atomic_thread_fence (std::memory_order_release);
383- const auto outPos = circular_queue<T>::m_outPos.load (std::memory_order_relaxed);
382+ const auto outPos = circular_queue<T>::m_outPos.load (std::memory_order_acquire);
384383 const auto inPos = circular_queue<T>::m_inPos.load (std::memory_order_relaxed);
385384 std::atomic_thread_fence (std::memory_order_acquire);
386385 if (inPos == outPos) return circular_queue<T>::defaultValue;
387386 T& val = circular_queue<T>::m_buffer[inPos] = std::move (circular_queue<T>::m_buffer[outPos]);
388387 const auto bufSize = circular_queue<T>::m_bufSize;
389388 std::atomic_thread_fence (std::memory_order_release);
390389 circular_queue<T>::m_outPos.store ((outPos + 1 ) % bufSize, std::memory_order_relaxed);
391- circular_queue<T>::m_inPos.store ((inPos + 1 ) % bufSize, std::memory_order_relaxed );
390+ circular_queue<T>::m_inPos.store ((inPos + 1 ) % bufSize, std::memory_order_release );
392391 return val;
393392 }
394393
@@ -400,7 +399,7 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
400399 */
401400 bool for_each_requeue (std::function<bool (T&)> fun)
402401 {
403- auto inPos0 = circular_queue<T>::m_inPos.load (std::memory_order_relaxed );
402+ auto inPos0 = circular_queue<T>::m_inPos.load (std::memory_order_acquire );
404403 auto outPos = circular_queue<T>::m_outPos.load (std::memory_order_relaxed);
405404 std::atomic_thread_fence (std::memory_order_acquire);
406405 if (outPos == inPos0) return false ;
@@ -418,14 +417,14 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
418417 std::atomic_thread_fence (std::memory_order_acquire);
419418 circular_queue<T>::m_buffer[inPos] = std::move (val);
420419 std::atomic_thread_fence (std::memory_order_release);
421- circular_queue<T>::m_inPos.store ((inPos + 1 ) % circular_queue<T>::m_bufSize, std::memory_order_relaxed );
420+ circular_queue<T>::m_inPos.store ((inPos + 1 ) % circular_queue<T>::m_bufSize, std::memory_order_release );
422421 }
423422 else
424423 {
425424 std::atomic_thread_fence (std::memory_order_release);
426425 }
427426 outPos = (outPos + 1 ) % circular_queue<T>::m_bufSize;
428- circular_queue<T>::m_outPos.store (outPos, std::memory_order_relaxed );
427+ circular_queue<T>::m_outPos.store (outPos, std::memory_order_release );
429428 } while (outPos != inPos0);
430429 return true ;
431430 }
0 commit comments