parent
603f89baa6
commit
8dcca18674
5 changed files with 88 additions and 8 deletions
@ -0,0 +1,79 @@ |
||||
#pragma once |
||||
|
||||
#include <condition_variable> |
||||
#include <functional> |
||||
#include <mutex> |
||||
#include <queue> |
||||
#include <thread> |
||||
|
||||
namespace Bk
|
||||
{ |
||||
class ThreadPool |
||||
{ |
||||
public: |
||||
ThreadPool(size_t num_threads |
||||
= std::thread::hardware_concurrency()) |
||||
{ |
||||
|
||||
for (size_t i = 0; i < num_threads; ++i) { |
||||
threads_.emplace_back([this] { |
||||
while (true) { |
||||
std::function<void()> task; |
||||
{ |
||||
std::unique_lock<std::mutex> lock(queue_mutex_); |
||||
cv_.wait(lock, [this] { |
||||
return !tasks_.empty() || stop_; |
||||
}); |
||||
|
||||
if (stop_ && tasks_.empty()) { |
||||
return; |
||||
} |
||||
|
||||
task = std::move(tasks_.front()); |
||||
tasks_.pop(); |
||||
} |
||||
task(); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
~ThreadPool() |
||||
{ |
||||
{ |
||||
std::unique_lock<std::mutex> lock(queue_mutex_); |
||||
stop_ = true; |
||||
} |
||||
|
||||
cv_.notify_all(); |
||||
|
||||
for (auto& thread : threads_) { |
||||
thread.join(); |
||||
} |
||||
} |
||||
|
||||
void queue(std::function<void()> task) |
||||
{ |
||||
{ |
||||
std::unique_lock<std::mutex> lock(queue_mutex_); |
||||
tasks_.emplace(std::move(task)); |
||||
} |
||||
cv_.notify_one(); |
||||
} |
||||
|
||||
void stop() |
||||
{ |
||||
std::unique_lock<std::mutex> lock(queue_mutex_); |
||||
stop_ = true; |
||||
} |
||||
|
||||
private: |
||||
std::vector<std::thread> threads_; |
||||
std::queue<std::function<void()> > tasks_; |
||||
|
||||
std::mutex queue_mutex_; |
||||
std::condition_variable cv_; |
||||
|
||||
bool stop_ = false; |
||||
}; |
||||
} |
Loading…
Reference in New Issue