一个线程池与任务池相结合的案例
来源:互联网 发布:windows任务管理器画图 编辑:程序博客网 时间:2024/06/05 23:05
在上篇博文中,我们简单地将每个线程的 执行函数进行了抽象化,这篇博文在此基础上设计了一个简单的任务池,废话不说,直接上代码:
#ifndef __TASK__POOL__H#define __TASK__POOL__H#include "Thread.h"#include "Task.h"#include <stack>#include <boost/thread/mutex.hpp>#include <boost/thread/locks.hpp>static boost::mutex g_mutex;class TaskPool{ public: TaskPool(){} ~TaskPool(){} public: void addTask(Task* task) { g_mutex.lock(); taskList.push(task); g_mutex.unlock(); } void runTask() { Thread* thread = threadPool.assignThread(); assert(thread); g_mutex.lock(); Task* task = taskList.top(); taskList.pop(); g_mutex.unlock(); thread->setThreadFun(task); thread->run(); } private: std::stack<Task*> taskList; ThreadPool threadPool;};#endif
其他的代码请参见上篇博文,这里面我只是实现了两个函数,其实完全可以根据需要在此自行添加,另外在taskpool中使用了boost::mutex这个互斥量,主要是为了简单,其次如果可以的话,完全可以换成其他的几种同步机制,如果有机会的话,我们会对其他的几种机制进行分析介绍的,在此不再多说,接下来看看测试用例吧,代码如下:
#include "Thread.h"#include "Task.h"#include "TaskPool.h"int main(){ PrintTask printTask; CacluateTask cacluateTask; CommTask commTask;/* int threadNum = 10; ThreadPool threadPool(10); threadPool.addThread(threadNum,&printTask); threadPool.startAll(); threadPool.stopAll(); sleep(1); Thread* thread = threadPool.assignThread(); assert(thread); thread->setThreadFun(&cacluateTask); thread->run(); sleep(1); thread = threadPool.assignThread(); assert(thread); thread->setThreadFun(&commTask); thread->run(); sleep(5); threadPool.delThread(threadNum); */ TaskPool taskPool; taskPool.addTask(&printTask); taskPool.addTask(&cacluateTask); taskPool.addTask(&commTask); taskPool.runTask(); //taskPool.runTask(); return 0;}
总结
上述代码很简单,只是对Task进行了简单的管理,但是思想也是值得学习的,里面只涉及了一个线程库,如果需要的话,完全可以在此基础上进行扩展出更为复杂的功能,写这篇博文的主要目的就是为了能够将线程池应用到任务当中,这也是任务池的设计思想,有机会的话,自己会对这块进行深化,希望能够有所收获。
如果需要,请注明转载,多谢
1 0
- 一个线程池与任务池相结合的案例
- 一个用来“拉”任务的简单线程池 c#版
- 一个适合绝大多数场景下的批量任务线程池
- 线程池线程数与(CPU密集型任务和I/O密集型任务)的关系
- 最精简的java 线程池与任务队列
- 最精简的java 线程池与任务队列
- 线程任务池的书写
- 多线程线程池控制一个方法的并发量 限制只有5个线程执行任务
- Android中的线程池与任务队列
- Android中的线程池与任务队列
- Android中的线程池与任务队列
- Java 自定义 线程池与任务队列
- 简要分析任务与线程池
- Java 自定义 线程池与任务队列
- 基于BootStrap与PHP相结合的带有搜索框的ajax无刷新分页案例(支持三种搜索)
- 一个炫酷的 TabLayout 与 CoordinatorLayout 相结合的自定义控件
- 实现一个所有任务都是按各自自定义的时间间隔周期性执行的线程池
- arcgis api for javascrpit 与easyui相结合时遇到的一个问题
- Next Permutation
- java.util.Timer(定时执行某项程序)
- openerp idea 模块安装
- linux重定向及nohup不输出的方法
- 二进制交叉权限微型php类 代码分享
- 一个线程池与任务池相结合的案例
- 黑马程序员--DOM学习笔记
- Retrieving Assets from the Assets Library(不用内置GUI组件,检索手机中的相片/视频资源)
- U盘复制东西提示文件太大怎么办?
- ZOJ 2541 Goods Transportation
- HDU_4788_Hard Disk Drive(打表)(13成都现场H题)
- 杭电 2058 The sum problem
- 黑马程序员--JQuery学习笔记
- flex垃圾回收机制