13 #include <condition_variable>
22 inline namespace _V1 {
26 std::vector<std::thread> MLaunchedThreads;
29 std::queue<std::function<void()>> MJobQueue;
30 std::mutex MJobQueueMutex;
31 std::condition_variable MDoSmthOrStop;
32 std::atomic_bool MStop;
33 std::atomic_uint MJobsInPool;
37 std::unique_lock<std::mutex> Lock(MJobQueueMutex);
40 Lock, [
this]() {
return !MJobQueue.empty() || MStop.load(); });
45 std::function<void()> Job = std::move(MJobQueue.front());
58 MLaunchedThreads.reserve(MThreadCount);
63 for (
size_t Idx = 0; Idx < MThreadCount; ++Idx)
64 MLaunchedThreads.emplace_back([
this] { worker(); });
69 while (MJobsInPool != 0)
70 std::this_thread::yield();
73 ThreadPool(
unsigned int ThreadCount = 1) : MThreadCount(ThreadCount) {
82 MDoSmthOrStop.notify_all();
84 for (std::thread &Thread : MLaunchedThreads)
85 if (Thread.joinable())
89 template <
typename T>
void submit(T &&Func) {
91 std::lock_guard<std::mutex> Lock(MJobQueueMutex);
92 MJobQueue.emplace([F = std::move(Func)]() { F(); });
95 MDoSmthOrStop.notify_one();
98 void submit(std::function<
void()> &&Func) {
100 std::lock_guard<std::mutex> Lock(MJobQueueMutex);
101 MJobQueue.emplace(Func);
104 MDoSmthOrStop.notify_one();