From b5ae2746a250841787ed51f1f78fb883b007f39e Mon Sep 17 00:00:00 2001 From: mutouyun Date: Thu, 20 Dec 2018 17:14:27 +0800 Subject: [PATCH] not throw but waiting when size == 0 --- include/circ_queue.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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)); } }