所在的位置: C++ >> C++市场 >> 基于C11的线程池thread

基于C11的线程池thread

北京手足癣医院在哪 http://baidianfeng.39.net/a_zhiliao/210410/8833646.html

咳咳。C++11加入了线程库,从此告别了标准库不支持并发的历史。然而c++对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等。

线程池(threadpool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复。”貌似没有问题吧。但是写起程序来的时候就出问题了。

废话不多说,先上实现,然后再啰嗦。(donttalk,showmeurcode!)

代码实现

文末有GitHub链接,但是没人去看更新的,现在更新下好了---01/05/31

#pragmaonce#ifndefTHREAD_POOL_H#defineTHREAD_POOL_H#includevector#includequeue#includeatomic#includefuture//#includecondition_variable//#includethread//#includefunctional#includestdexceptnamespacestd{//线程池最大容量,应尽量设小一点#defineTHREADPOOL_MAX_NUM16//#defineTHREADPOOL_AUTO_GROW//线程池,可以提交变参函数或拉姆达表达式的匿名函数执行,可以获取执行返回值//不直接支持类成员函数,支持类静态成员函数或全局函数,Opteron()函数等classthreadpool{usingTask=functionvoid();//定义类型vectorthread_pool;//线程池queueTask_tasks;//任务队列mutex_lock;//同步condition_variable_task_cv;//条件阻塞atomicbool_run{true};//线程池是否执行atomicint_idlThrNum{0};//空闲线程数量public:inlinethreadpool(unsignedshortsize=4){addThread(size);}inline~threadpool(){_run=false;_task_cv.notify_all();//唤醒所有线程执行for(threadthread:_pool){//thread.detach();//让线程“自生自灭”if(thread.joinable())thread.join();//等待任务结束,前提:线程一定会执行完}}public://提交一个任务//调用.get()获取返回值会等待任务执行完,获取返回值//有两种方法可以实现调用类成员,//一种是使用bind:.


转载请注明:http://www.aierlanlan.com/rzdk/485.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了