#ifndef THREAD_POOL
#define THREAD_POOL
#include <mutex>
#include <condition_variable>
#include <queue>
#include <thread>
#include <functional>
#include <assert>
class ThreadPool
{
public:
explicit ThreadPool(size_t threadCount = 8):pool_(std::make_shared<new Pool>)
{
assert(threadCount > 0);
for(size_t i = 0; i < threadCount; ++i)
{
std::thread([pool = pool_]{
std::unique_lock<std::mutex> locker(pool->mtx);
while(true)
{
if (!pool->tasks.empty())
{
//有任务,取出第一个任务
auto task = std::move(pool->tasks.front());
pool->tasks.pop();
locker.unlock(); //让其他线程可以取任务
task();
locker.lock();
}
else if(pool->is_close)
{
break; //跳出循环,不处理任务了
}
else
{
pool->cond.wait(locker);
}
}
}).detach();
}
}
ThreadPool() = default;
ThreadPool(ThreadPool&&) = default;
~ThreadPool()
{
if(static_cast<bool>(pool_))
{
{
//锁
std::lock_guard<std::mutex> locker(pool_->mtx);
pool_->is_close = true;
}
pool_->cond.notify_all();
}
}
template<class F>
bool addTask(F&& task)
{
{
//锁
std::lock_guard<std::mutex> locker(pool_->mtx);
pool_->tasks.emplace(std::forward<F>(task));
}
pool_->cond.notify_one();
}
private:
struct Pool
{
std::mutex mtx;
std::condition_variable cond;
bool is_close;
std::queue<std::function<void()> > tasks;
};
std::shared_ptr<Pool> pool_;
};
#endif
c++11实现一个简单的线程池
最新推荐文章于 2022-09-01 23:28:57 发布