使用boost的多线程库写的线程池测试用例

来源:互联网 发布:java定时任务时间设置 编辑:程序博客网 时间:2024/05/21 13:54

/*

 * 请保存为 task_queue.h文件

 * 任务队列用来管理一系列的任务,多个工作线程阻塞在队列的条件变量上,当有任务

 * 加入时,则唤醒工作线程,工作完毕后继续阻塞

 */

#ifndef TASK_QUEUE_H_

#define TASK_QUEUE_H_

 

#include <queue>

#include <boost/thread.hpp>

#include <boost/noncopyable.hpp>

#include <boost/function.hpp>

 

//定义任务队列

template<class Task>

class TaskQueue:boost::noncopyable {

 public:

  void PushTask(const Task & task_func) {

    boost::unique_lock<boost::mutex> lock(task_mutex_);

    task_queue_.push(task_func);

    cond_.notify_one();

  }

 

  Task GetTask() {

    boost::unique_lock<boost::mutex> lock(task_mutex_);

    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<Task> task_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 <boost/thread.hpp>

#include <boost/noncopyable.hpp>

#include <boost/function.hpp>

#include <iostream>

using namespace std;

 

#include "task_queue.h"

 

template<class Task>

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<Task> task_queue_;

  boost::thread_group thread_group_;

  int thread_num_;

  volatile bool is_run_;

};

 

#endif

 

/*

* 保存为main.cc

 * 测试线程池的使用

 * */

#include "task_queue.h"

#include "thread_pool.h"

#include <iostream>

 

typedef boost::function<void(void)> Task;

 

void print_task(int i)

{

  printf("I'm task %d\n",i);

}

 

int main(int argc, char* argv[]) {

  ThreadPool<Task> tp(4);

  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