From 96a58cc251354954241aa2c9008b25d98daaad92 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 19 Jan 2021 20:35:29 +0000 Subject: Add basic work and worker thread pool Well... that requires GCC 11 cos 10 doesn't implement semaphore. --- lib/worker.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/worker.cpp (limited to 'lib/worker.cpp') diff --git a/lib/worker.cpp b/lib/worker.cpp new file mode 100644 index 0000000..3c12caa --- /dev/null +++ b/lib/worker.cpp @@ -0,0 +1,46 @@ +#include "worker.h" +#include "work.h" +#include +#include +#include + +Worker::Worker() : todoLen {0} +{ + std::generate_n(std::back_inserter(threads), std::thread::hardware_concurrency(), [this]() { + return std::thread {&Worker::worker, this}; + }); +} + +Worker::~Worker() +{ + todoLen.release(std::thread::hardware_concurrency()); + std::for_each(threads.begin(), threads.end(), [](auto & th) { + th.join(); + }); +} + +void +Worker::addWork(WorkPtr j) +{ + std::lock_guard lck {todoMutex}; + todoLen.release(); + todo.emplace_back(std::move(j)); +} + +void +Worker::worker() +{ + auto job = [this]() { + todoLen.acquire(); + std::lock_guard lck {todoMutex}; + if (todo.size()) { + WorkPtr x = std::move(todo.front()); + todo.pop_front(); + return x; + } + return WorkPtr {}; + }; + while (auto j = job()) { + j->doWork(); + } +} -- cgit v1.2.3