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