diff options
Diffstat (limited to 'competition/job.cpp')
-rw-r--r-- | competition/job.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/competition/job.cpp b/competition/job.cpp new file mode 100644 index 0000000..043074e --- /dev/null +++ b/competition/job.cpp @@ -0,0 +1,51 @@ +#include <chrono> +#include <cassert> +#include "job.h" + +void Scheduler::workerEntry() { + while (true) { + Job *job = nullptr; + + { + lock_guard commMutGuard(commMut); + if (terminateFlag) break; + if (jobs.size() > 0) { + job = jobs.front(); + jobs.pop(); + } + } + + if (job) { + job->callback(); + } 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<void()> &func) { + Job *job = new Job(func); + lock_guard commMutGuard(commMut); + jobs.push(job); +} + +void Scheduler::finish() { + for (int i = 0; i < nthreads; i++) { + workers[i].join(); + } +} |