-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathThreadPool.cpp
More file actions
36 lines (32 loc) · 1008 Bytes
/
ThreadPool.cpp
File metadata and controls
36 lines (32 loc) · 1008 Bytes
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
#include "ThreadPool.h"
ThreadPool::ThreadPool(size_t num_thread) : working(false) {
for (size_t i = 0; i < num_thread; i++) {
threads.emplace_back([this]() {
localThreadPoolPtr = this;
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(mutex);
conditionVariable.wait(lock, [this]() {
return !queue.empty() || working;
});
if (working && queue.empty()) return;
task = std::move(queue.front());
queue.pop();
}
task();
}
});
}
}
ThreadPool::~ThreadPool() {
{
working = true;
std::unique_lock<std::mutex> lock(mutex);
}
conditionVariable.notify_all();
for (auto &thread: threads) {
thread.join();
}
}
thread_local ThreadPool *ThreadPool::localThreadPoolPtr = nullptr;