同步操作将从 Long_xu/cppThreadPool 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "cppThreadPool.h"CPP_ThreadPool::CPP_ThreadPool():_threadNum(1),_bTerminate(false)//构造函数,初始线程数为1{}// 析构函数,结束线程池CPP_ThreadPool::~CPP_ThreadPool(){stop();}bool CPP_ThreadPool::init(size_t num){unique_lock<mutex> lock(_mutex);if(!_threads.empty())return false;_threadNum=num;return true;}void CPP_ThreadPool::stop(){// 注意要有这个{},不然会死锁。{unique_lock<mutex> lock(_mutex);_bTerminate=true;_condition.notify_all();}size_t thdCount=_threads.size();for(size_t i=0;i<thdCount;i++){if(_threads[i]->joinable()){_threads[i]->join();}delete _threads[i];_threads[i]=NULL;}unique_lock<mutex> lock(_mutex);_threads.clear();}bool CPP_ThreadPool::start(){unique_lock<mutex> lock(_mutex);if(!_threads.empty())return false;for(size_t i=0;i<_threadNum;i++){_threads.push_back(new thread(&CPP_ThreadPool::run,this));}return true;}bool CPP_ThreadPool::get(TaskFuncPtr& task){unique_lock<mutex> lock(_mutex);if(_tasks.empty()){_condition.wait(lock,[this]{return _bTerminate || !_tasks.empty();});}if(_bTerminate)return false;if(!_tasks.empty()){task=move(_tasks.front());_tasks.pop();return true;}return false;}// 执行任务的线程void CPP_ThreadPool::run(){while(!isTerminate()){TaskFuncPtr task;// 读取任务bool ok=get(task);if(ok){++_atomic;try{if(task->_expireTime!=0 && task->_expireTime < TNOWMS){// 处理超时任务}elsetask->_func();//执行任务}catch(...){}--_atomic;// 任务执行完毕,这里只是为了通知waitForAllDoneunique_lock<mutex> lock(_mutex);if(_atomic==0 && _tasks.empty())_condition.notify_all();}}}bool CPP_ThreadPool::waitForAllDone(int millsecond){unique_lock<mutex> lock(_mutex);if(_tasks.empty())return true;if(millsecond<0){_condition.wait(lock,[this]{ return _tasks.empty();});return true;}else{return _condition.wait_for(lock,chrono::milliseconds(millsecond),[this]{ return _tasks.empty();});}}int gettimeofday(struct timeval &tv){#if WIN32time_t clock;struct tm tm;SYSTEMTIME wtm;GetLocalTime(&wtm);tm.tm_year = wtm.wYear - 1900;tm.tm_mon = wtm.wMonth - 1;tm.tm_mday = wtm.wDay;m.tm_hour = wtm.wHour;tm.tm_min = wtm.wMinute;tm.tm_sec = wtm.wSecond;tm. tm_isdst = -1;clock = mktime(&tm);tv.tv_sec = clock;tv.tv_usec = wtm.wMilliseconds * 1000;return 0;#elsereturn ::gettimeofday(&tv, 0);#endif}void getNow(timeval *tv){#if TARGET_PLATFORM_IOS || TARGET_PLATFORM_LINUXint idx = _buf_idx;*tv = _t[idx];if(fabs(_cpu_cycle - 0) < 0.0001 && _use_tsc){addTimeOffset(*tv, idx);}else{TC_Common::gettimeofday(*tv);}#elsegettimeofday(*tv);#endif}int64_t getNowMs(){struct timeval tv;getNow(&tv);return tv.tv_sec * (int64_t)1000 + tv.tv_usec / 1000;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。