4#include <condition_variable>
27 const int n = std::max(0, workers);
28 for (
int i = 0; i < n; ++i)
34 std::lock_guard<std::mutex> lk(
mu_);
51 for (
int i = 0; i < n; ++i)
56 auto job = std::make_shared<Job>();
58 job->next.store(0, std::memory_order_relaxed);
59 job->remaining.store(n, std::memory_order_relaxed);
63 std::lock_guard<std::mutex> lk(
mu_);
64 for (
size_t i = 0; i <
threads_.size(); ++i)
71 std::unique_lock<std::mutex> lk(job->doneMu);
72 job->doneCv.wait(lk, [&] {
73 return job->remaining.load(std::memory_order_acquire) == 0;
82 std::function<void(
int)>
fn;
89 std::condition_variable
cv_;
90 std::queue<std::shared_ptr<Job>>
jobs_;
93 static void finish_one(
const std::shared_ptr<Job> &job) {
94 if (job->remaining.fetch_sub(1, std::memory_order_acq_rel) == 1) {
95 std::lock_guard<std::mutex> lk(job->doneMu);
96 job->doneCv.notify_one();
100 static void run_job(
const std::shared_ptr<Job> &job) {
102 const int idx = job->next.fetch_add(1, std::memory_order_relaxed);
103 if (idx >= job->total)
112 std::shared_ptr<Job> job;
114 std::unique_lock<std::mutex> lk(
mu_);
PersistentThreadPool(int workers)
Definition PersistentThreadPool.hpp:26
PersistentThreadPool(const PersistentThreadPool &)=delete
std::mutex mu_
Definition PersistentThreadPool.hpp:88
std::queue< std::shared_ptr< Job > > jobs_
Definition PersistentThreadPool.hpp:90
static void finish_one(const std::shared_ptr< Job > &job)
Definition PersistentThreadPool.hpp:93
PersistentThreadPool & operator=(const PersistentThreadPool &)=delete
static void run_job(const std::shared_ptr< Job > &job)
Definition PersistentThreadPool.hpp:100
bool stop_
Definition PersistentThreadPool.hpp:91
~PersistentThreadPool()
Definition PersistentThreadPool.hpp:32
std::condition_variable cv_
Definition PersistentThreadPool.hpp:89
std::vector< std::thread > threads_
Definition PersistentThreadPool.hpp:87
void parallel_for(int n, const std::function< void(int)> &fn)
Definition PersistentThreadPool.hpp:47
void worker_loop()
Definition PersistentThreadPool.hpp:110
Definition PersistentThreadPool.hpp:78
int total
Definition PersistentThreadPool.hpp:79
std::condition_variable doneCv
Definition PersistentThreadPool.hpp:84
std::mutex doneMu
Definition PersistentThreadPool.hpp:83
std::atomic< int > remaining
Definition PersistentThreadPool.hpp:81
std::atomic< int > next
Definition PersistentThreadPool.hpp:80
std::function< void(int)> fn
Definition PersistentThreadPool.hpp:82