53 struct roundrobin_pool
56 roundrobin_pool(roundrobin_pool&&) =
delete;
57 auto operator=(roundrobin_pool&&) =
delete;
58 roundrobin_pool(roundrobin_pool&) =
delete;
59 auto operator=(roundrobin_pool&) =
delete;
68 for (
unsigned i = 0; i < ((N > 0) ? N : std::thread::hardware_concurrency()); i++) {
69 workers.emplace_back(c);
73 workersSize = workers.size();
87 size_t idx = nextWorkerIndex();
88 workers.at(idx).queue(std::move(item));
90 queueCounter.fetch_add(1, std::memory_order_release);
93#if defined(NLOHMANN_JSON_VERSION_MAJOR)
97 nlohmann::json toJson()
const
99 return {{
"_typver",
"siddiqsoft.asynchrony-lib.roundrobin_pool/0.10"},
100 {
"workersSize", workersSize},
101 {
"queueCounter", queueCounter.load(std::memory_order_acquire)}};
107 std::atomic_uint64_t queueCounter {0};
110 std::atomic_uint64_t queueCounter {0};
117 std::deque<simple_worker<T>> workers {};
120 uint64_t workersSize {};
127 size_t nextWorkerIndex()
129 if (workersSize == 0)
return 0;
130 return static_cast<size_t>(queueCounter.load(std::memory_order_acquire) % workersSize);
140 static void to_json(nlohmann::json& dest,
const siddiqsoft::roundrobin_pool<T, N>& src)