A.Boost线程池实现
参考自: Boost库实现线程池实例
原理:使用boost的thread_group存储多个线程,使用bind方法将要处理的函数转换成线程可调用的函数进行执行;使用队列存储待处理任务,利用Mutex实现队列线程安全。
#ifndef MYTHREADPOOL_H #define MYTHREADPOOL_H #include #include #include #include #include #include using namespace boost; typedef boost::function MyTask; //任务队列--noncopyable class MyTaskQueue : boost::noncopyable { private: std::queue m_taskQueue; boost::mutex m_mutex;//互斥锁 boost::condition_variable_any m_cond;//条件变量 public: void push_Task(const MyTask& task){ //加上互斥锁 boost::unique_lock lock(m_mutex); m_taskQueue.push(task); //通知其他线程启动 m_cond.notify_one(); } MyTask pop_Task(){ //加上互斥锁 boost::unique_lock lock(m_mutex); if(m_taskQueue.empty()) { //如果队列中没有任务,则等待互斥锁 m_cond.wait(lock);// } //指向队列首部 MyTask task(m_taskQueue.front()); //出队列 m_taskQueue.pop(); return task; } int get_size() { return m_taskQueue.size(); } }; class MyThreadPool : boost::noncopyable { private: //任务队列 MyTaskQueue m_taskQueue; //线程组 boost::thread_group m_threadGroup; int m_threadNum; /* volatile 被设计用来修饰被不同线程访问和修改的变量。 volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取, 因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 volatile可以保证对特殊地址的稳定访问,不会出错。 */ volatile bool is_run; void run(){//线程池中线程的处理函数 while(is_run){ //一直处理线程池的任务 MyTask task = m_taskQueue.pop_Task(); task();//运行bind的函数 } } public: MyThreadPool(int num):m_threadNum(num),is_run(false)//初始化列表 { } ~MyThreadPool(){ stop(); } void init() { if(m_threadNum关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录