diff --git a/include/circ_elem_array.h b/include/circ_elem_array.h index 95c86be..9ab4f59 100644 --- a/include/circ_elem_array.h +++ b/include/circ_elem_array.h @@ -38,8 +38,8 @@ struct alignas(std::max_align_t) elem_array_head { } auto acquire(void) { - for (unsigned k = 0; lc_.exchange(1, std::memory_order_acquire); ++k) { - yield(k); + while (lc_.exchange(1, std::memory_order_acquire)) { + std::this_thread::yield(); } return index_of(wt_.load(std::memory_order_relaxed)); } @@ -107,7 +107,7 @@ public: void* acquire(void) { elem_t* el = elem(base_t::acquire()); // check all consumers have finished reading - for (unsigned k = 0;; ++k) { + while(1) { uint_t<32> expected = 0; if (el->head_.rc_.compare_exchange_weak( expected, @@ -115,7 +115,7 @@ public: std::memory_order_release)) { break; } - yield(k); + std::this_thread::yield(); } return el->data_; } diff --git a/include/def.h b/include/def.h index 111e7e2..75c673f 100644 --- a/include/def.h +++ b/include/def.h @@ -4,7 +4,6 @@ #include #include #include -#include namespace ipc { @@ -87,9 +86,7 @@ inline void yield(unsigned k) { else if (k < 16) { IPC_LOCK_PAUSE_(); } else - if (k < 32) { std::this_thread::yield(); } - else - { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + { std::this_thread::yield(); } } } // namespace ipc