#ifndef MY_TASK_QUEUE_H #define MY_TASK_QUEUE_H #include <queue> #include <boost/thread.hpp> #include <boost/noncopyable.hpp> #include <boost/function.hpp> //using namespace boost; //using namespace std; typedef boost::function<void(void)> my_task; //任务队列 class Task_queue:boost::noncopyable { private: std::queue<my_task> my_queue; boost::condition_variable_any cond; boost::mutex my_mutex; public: void push_task(const my_task & task_func) { //加上互斥锁 boost::unique_lock<boost::mutex> lock(my_mutex); my_queue.push(task_func); //通知其他线程启动 cond.notify_one(); } my_task get_task(){ //加上互斥锁 boost::unique_lock<boost::mutex> lock(my_mutex); if(my_queue.size()==0) { //如果队列中没有任务,则等待互斥锁 cond.wait(lock); } //指向队列首部 my_task task(my_queue.front()); //出队列 my_queue.pop(); return task; } int get_size() { return my_queue.size(); } }; #endif
#ifndef MY_THREAD_POOL_H #define MY_THREAD_POOL_H #include <boost/thread.hpp> #include <boost/noncopyable.hpp> #include <boost/function.hpp> #include "My_Task_queue.h" #include <iostream> using namespace std; class My_thread_pool:boost::noncopyable { private: //线程队列 Task_queue my_queue; //线程组 boost::thread_group my_thread_group; int thread_num; volatile bool is_run; void run() { while(is_run) { cout<<"run "<<endl; //一直处理线程池的任务 my_task task=my_queue.get_task(); task(); } } public: My_thread_pool(int num):thread_num(num),is_run(false) { }; ~My_thread_pool(){ }; void init() { is_run=true; if(thread_num<=0) { return ; } for(int i=0;i<thread_num;++i) { //生成多个线程,绑定run函数,添加到线程组 my_thread_group.add_thread(new boost::thread(boost::bind(&My_thread_pool::run,this))); } } //停止线程池 void stop() { is_run=false; } //添加任务 void post(const my_task &task) { my_queue.push_task(task); } void wait() { my_thread_group.join_all(); } }; #endif
#include "My_Task_queue.h" #include "My_thread_pool.h" #include <iostream> #include <cstdlib> using namespace std; void print_task(int i) { cout<<"I am Task "<<i<<" number:"<<endl; } //使用boost线程池 编译参数加上-lboost_thread int main(int argc, char** argv) { My_thread_pool tp(4); tp.init(); my_task task[4]; for(int i=0;i<4;i++) { //生成线程任务,类型为函数指针 boost::function<void(void)> task[i]=boost::bind(print_task,i+1); //放到线程池中处理 tp.post(task[i]); } //等待线程池处理完成! tp.wait(); return 0; }