代码拉取完成,页面将自动刷新
#include "ThreadPool.h"
const int THREAD_MAX_THRESHHOLD = 1024;
const int TASK_MAX_THRESHHOLD = INT32_MAX;
ThreadPool::ThreadPool()
:initThreadSize_(0),
threadSize_(0),
taskSize_(0)
threadSizeThreshHold_(THREAD_MAX_THRESHHOLD),
taskSizeThreshHold_(TASK_MAX_THRESHHOLD),
mode_(PoolMode::MODE_FIXED)
{
}
void ThreadPool::start(size_t initThreadSize){
initThreadSize_=initThreadSize;
//创建线程对象
for(size_t i=0;i<initThreadSize_;i++){
auto ptr= std::make_unique<Thread>(std::bind(&ThreadPool::threadFunc,this));
threads_.emplace(std::move(ptr));
}
//启动线程
for(auto begin=threads_.begin();begin!=threads_.end();++begin){
(*begin)->start();
threadSize_++;
}
}
//每个线程启动后都会执行这个函数入口
void ThreadPool::threadFunc(){
while(true){
std::unique_lock<std::recursive_mutex> lock(mutex_);
notEmpty_.wait(lock,[this](){
taskSize_>0;
});
std::shared_ptr<Task> task= taskQue_.front();
taskQue_.pop();
--taskSize_;
//释放锁
lock.unlock();
//执行任务
task->run();
}
}
void ThreadPool::submitTask(std::shared_ptr<Task>& task){
//获取锁
std::unique_lock<std::recursive_mutex> lock(mutex_);
if(!notFull_.wait_for(lock,std::chrono::seconds(1),[this](){
return taskSize_<taskSizeThreshHold_;
})){
std::cerr << "task queue is full, submit task fail." << std::endl;
}
taskQue_.emplace(task);
++taskSize_;
notEmpty_.notify_all();
}
ThreadPool::Thread::Thread(ThreadFunc && func)
:func_(std::move(func))
{
}
void ThreadPool::Thread::start(){
std::thread th(func_);
th.detach();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。