not throw but waiting when size == 0

This commit is contained in:
mutouyun 2018-12-20 17:14:27 +08:00
parent 0429a2c87b
commit b5ae2746a2

View File

@ -7,6 +7,8 @@
#include <algorithm>
#include <atomic>
#include <tuple>
#include <thread>
#include <chrono>
#include "def.h"
#include "circ_elem_array.h"
@ -111,9 +113,8 @@ public:
template <typename F>
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<std::size_t>(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));
}
}