blob: 136c50ed58a2198978180cbdc1b86adb91ef60d4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#pragma once
#include <deque>
#include <memory>
#include <mutex>
#include <semaphore>
#include <special_members.hpp>
#include <thread>
#include <utility>
#include <vector>
class Work;
class Worker {
private:
Worker();
~Worker();
NO_COPY(Worker);
NO_MOVE(Worker);
using WorkPtr = std::unique_ptr<Work>;
template<typename T, typename... Params>
void
addWork(Params &&... params)
requires std::is_base_of_v<Work, T>
{
addWork(std::make_unique<T>(std::forward<Params>(params)...));
}
void addWork(WorkPtr w);
private:
void worker();
using Threads = std::vector<std::thread>;
using ToDo = std::deque<WorkPtr>;
Threads threads;
ToDo todo;
std::counting_semaphore<16> todoLen;
std::mutex todoMutex;
static Worker instance;
};
|