/*
* 请保存为 task_queue.h文件
* 任务队列用来管理一系列的任务,多个工作线程阻塞在队列的条件变量上,当有任务
* 加入时,则唤醒工作线程,工作完毕后继续阻塞
*/
#ifndef TASK_QUEUE_H_
#define TASK_QUEUE_H_
#include
#include
#include
#include
//定义任务队列
template
class TaskQueue:boost::noncopyable {
public:
void PushTask(const Task & task_func) {
boost::unique_lock
task_queue_.push(task_func);
cond_.notify_one();
}
Task GetTask() {
boost::unique_lock
if(task_queue_.size() == 0) {
cond_.wait(lock);
}
Task task(task_queue_.front());
task_queue_.pop();
return task;
}
int GetSize() {
return task_queue_.size();
}
private:
std::queue
boost::condition_variable_any cond_;
boost::mutex task_mutex_;
};
#endif
/*
* 请保存为thread_pool.h
* 线程池使用boost中的thread_group来管理和创建工作线程,使其阻塞在任队列中
*/
#ifndef THREAD_POOL_H_
#define THREAD_POOL_H_
#include
#include
#include
#include
using namespace std;
#include "task_queue.h"
template
class ThreadPool:boost::noncopyable
{
public:
ThreadPool(int num):thread_num_(num),is_run_(false) {}
~ThreadPool() {}
void Init() {
is_run_ = true;
if(thread_num_ <= 0)
return;
for(int i = 0;i < thread_num_; ++i) {
thread_group_.add_thread(new boost::thread(boost::bind(&ThreadPool::Run,this)));
}
}
void Stop() {
is_run_=false;
}
void Post(const Task & task) {
task_queue_.PushTask(task);
}
void Wait() {
thread_group_.join_all();
}
private:
void Run() {
while(is_run_) {
Task task = task_queue_.GetTask();
task();
}
}
private:
TaskQueue
boost::thread_group thread_group_;
int thread_num_;
volatile bool is_run_;
};
#endif
/*
* 保存为main.cc
* 测试线程池的使用
* */
#include "task_queue.h"
#include "thread_pool.h"
#include
typedef boost::function
void print_task(int i)
{
printf("I'm task %d\n",i);
}
int main(int argc, char* argv[]) {
ThreadPool
tp.Init();
Task t[4];
for (int i = 0;i < 4; ++i) {
t[i] = boost::bind(print_task,i+1);
tp.Post(t[i]);
}
tp.Wait();
return 0;
}
以上代码可以转载,但是请标明作者:xidianwlc