34 lines
1.1 KiB
C++
34 lines
1.1 KiB
C++
|
#include "1_ThreadPool.h"
|
|||
|
#include <atomic>
|
|||
|
#include <mutex>
|
|||
|
#include <thread>
|
|||
|
|
|||
|
using namespace BeiChen;
|
|||
|
|
|||
|
ThreadPool::ThreadPool(int n) : _stop(false), _tg(_threads) {
|
|||
|
int nThreads = n;
|
|||
|
if (nThreads <= 0) {
|
|||
|
nThreads = std::thread::hardware_concurrency();
|
|||
|
nThreads = (nThreads == 0 ? 2 : nThreads);
|
|||
|
}
|
|||
|
|
|||
|
for (int i = 0; i != nThreads; ++i) {
|
|||
|
_threads.push_back(std::thread([this]{
|
|||
|
while (!_stop.load(std::memory_order_acquire)) {
|
|||
|
task_type task;
|
|||
|
{
|
|||
|
std::unique_lock<std::mutex> ulk(this->_mtx);
|
|||
|
// wait只有满足条件后,才会往下执行
|
|||
|
this->_cond.wait(ulk, [this]{
|
|||
|
return _stop.load(std::memory_order_acquire) ||
|
|||
|
!this->_tasks.empty();
|
|||
|
});
|
|||
|
if(_stop.load(std::memory_order_acquire)) return;
|
|||
|
task = std::move(this->_tasks.front());
|
|||
|
this->_tasks.pop();
|
|||
|
}
|
|||
|
task();
|
|||
|
}
|
|||
|
}));
|
|||
|
}
|
|||
|
}
|