#include #include #include #include "scheduler.h" void Scheduler::workerEntry() { while (true) { Job *job = nullptr; { lock_guard commMutGuard(commMut); if (jobs.size() > 0) { job = jobs.front(); jobs.pop(); } } if (job) { job->callback(); } else if (finishFlag) { break; } else { this_thread::sleep_for(chrono::milliseconds(100)); } } } Scheduler::Scheduler(int nthreads) : nthreads(nthreads) { assert(nthreads > 0); workers.reserve(nthreads); for (int i = 0; i < nthreads; i++) { workers.emplace_back([this]() { workerEntry(); }); } } Scheduler::~Scheduler() { finish(); } void Scheduler::submit(const function &func) { Job *job = new Job(func); lock_guard commMutGuard(commMut); jobs.push(job); } void Scheduler::finish() { if (hasJoined) return; { lock_guard commMutGuard(commMut); finishFlag = true; } for (int i = 0; i < nthreads; i++) { workers[i].join(); } hasJoined = true; }