使用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
- 使用boost的多线程库写的线程池测试用例
- BOOST 库 thread类线程使用 多线程处理的理解
- 多线程写图像文件的一点小测试(Boost + Gual)
- boost 线程池的使用
- 使用Boost.Asio写的多线程TCP转发代理服务器
- 使用Boost.Asio写的多线程TCP转发代理服务器
- 使用Boost.Asio写的多线程TCP转发代理服务器
- 使用Boost.Asio写的多线程TCP转发代理服务器
- <Boost> boost::thread 多线程的使用
- 使用boost线程池很好的例子
- boost库中线程的使用
- boost线程库测试
- 【Boost】boost库中thread多线程详解11——线程的休眠和中断
- 【Boost】boost库中thread多线程详解12——线程的分离与非分离
- 使用boost线程池(多线程使用opencv处理图片)
- 使用boost线程池(多线程使用opencv处理图片)
- 用boost实现的一个简易线程池库
- boost 库的 线程学习
- 面试---美团
- 怎样把excel一列分成多列
- google map API v2 在Eclipse上的配置
- Aruba AP設定Split Tunnel
- tomcat-高手总结文档
- 使用boost的多线程库写的线程池测试用例
- android注册 登录+修改帐号密码+添加资料+给指定帐号充值
- 透过差异谈完全备份、增量备份与差异备份
- php删除字符串末尾子字符
- JQuery上传插件Uploadify使用详解
- 解决iOS开发中防止键盘挡住UITextField问题
- hdoj_2006 求奇数的乘积
- asp.net常用开发技巧(2)
- 卡塔兰数