您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 互联网络程序设计实验-实验2
线程与线程池封装为了充分利用多核的优势,我们利用多线程来进行任务处理,但线程也同样不能滥用,会带来一下几个问题:1.线程本身存在开销,系统必须为每个线程分配如栈,TLS(线程局部存储),寄存器等。2.线程管理会给系统带来开销,context切换同样会给系统带来成本。3.线程本身是可以重用的资源,不需要每次都进行初始化。所以往往在使用中,我们无需把线程与task任务进行一对一对应,只需要预先初始化有限的线程个数来处理无限的task任务即可,线程池应运而生,原理也就是如此。一下主要基于c++11标准,以及配套的thread,mutex,condition_variable配套标准库设施实现ThreadPool类的封装。1ThreadPool类的设计ThreadPool主要封装了一个线程队列workers和一个任务队列tasks,以及相应的互斥信号量mutex和条件变量condition。在该类的设计中大量采用了c++11新标准中的设施,如future模块,以及vector中的emplace方法。ThreadPool源代码如下:ThreadPool.h#ifndefTHREAD_POOL_H#defineTHREAD_POOL_H#includevector#includequeue#includememory#includethread#includemutex#includecondition_variable#includefuture#includefunctional#includestdexceptclassThreadPool{public:ThreadPool(size_t);templateclassF,class...Argsautoenqueue(F&&f,Args&&...args)-std::futuretypenamestd::result_ofF(Args...)::type;~ThreadPool();private://needtokeeptrackofthreadssowecanjointhemstd::vectorstd::threadworkers;//thetaskqueuestd::queuestd::functionvoid()tasks;//synchronizationstd::mutexqueue_mutex;std::condition_variablecondition;boolstop;};//theconstructorjustlaunchessomeamountofworkersinlineThreadPool::ThreadPool(size_tthreads):stop(false){for(size_ti=0;ithreads;++i)workers.emplace_back([this]{for(;;){std::functionvoid()task;{std::unique_lockstd::mutexlock(this-queue_mutex);this-condition.wait(lock,[this]{returnthis-stop||!this-tasks.empty();});if(this-stop&&this-tasks.empty())return;task=std::move(this-tasks.front());this-tasks.pop();}task();}});}//addnewworkitemtothepooltemplateclassF,class...ArgsautoThreadPool::enqueue(F&&f,Args&&...args)-std::futuretypenamestd::result_ofF(Args...)::type{usingreturn_type=typenamestd::result_ofF(Args...)::type;autotask=std::make_sharedstd::packaged_taskreturn_type()(std::bind(std::forwardF(f),std::forwardArgs(args)...));std::futurereturn_typeres=task-get_future();{std::unique_lockstd::mutexlock(queue_mutex);//don'tallowenqueueingafterstoppingthepoolif(stop)throwstd::runtime_error(enqueueonstoppedThreadPool);tasks.emplace([task](){(*task)();});}condition.notify_one();returnres;}//thedestructorjoinsallthreadsinlineThreadPool::~ThreadPool(){{std::unique_lockstd::mutexlock(queue_mutex);stop=true;}condition.notify_all();for(std::thread&worker:workers)worker.join();}#endif
本文标题:互联网络程序设计实验-实验2
链接地址:https://www.777doc.com/doc-5942174 .html