class ThreadPool {
public:
ThreadPool(size_t size) {
for (size_t i = 0; i < size; i++) {
_workers.emplace_back(&ThreadPool::workerThread, this);
}
}
~ThreadPool() {
_bstop = true;
for (auto& worker : _workers) {
worker.join();
}
_condition.notify_all();
}
void enqueue(std::function<void()> task){
{
std::lock_guard<std::mutex> lock(_mutex);
_tasks.push(task);
}
_condition.notify_one();
}
void workerThread() {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(_mutex);
_condition.wait(lock, [this]() {
return _bstop || !_tasks.empty();
});
if (_bstop) return;
task = _tasks.front();
_tasks.pop();
}
task();
std::cout << "finish task" << std::endl;
}
}
private:
std::mutex _mutex;
std::condition_variable _condition;
std::vector<std::thread> _workers;
std::queue<std::function<void()>> _tasks;
std::atomic<bool> _bstop;
};