diff --git a/include/circ_queue.h b/include/circ_queue.h index 85c2b66..47629fa 100644 --- a/include/circ_queue.h +++ b/include/circ_queue.h @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "def.h" #include "circ_elem_array.h" @@ -111,9 +113,8 @@ public: template static queue* multi_wait_for(F&& upd) { - while (1) { + for (unsigned k = 0;; ++k) { auto [ques, size] = upd(); - if (size == 0) throw std::invalid_argument { "Invalid size." }; for (std::size_t i = 0; i < static_cast(size); ++i) { queue* que = ques[i]; if (que == nullptr) continue; @@ -124,7 +125,9 @@ public: return que; } } - std::this_thread::yield(); + if (k < 1024) std::this_thread::yield(); + // yielding coarsening + else std::this_thread::sleep_for(std::chrono::milliseconds(1)); } }