一个模板线程池

下载源代码

一个模板线程池,没有使用信号灯,互斥体等同步对象。

主要思路是初始化一个管理线程,管理线程通过消息协调任务链表和工作线程之间如何更好的工作,消息通信使用PostThreadMessage。

下面是模板线程池源代码

下面介绍如何使用这个模板线程池

1.任务类和模板实例化线程池类的定义及其实现

  1. /*====================================================================== 
  2. Copyright (c) 2010,zyq5945@126.com  
  3. All rights reserved.  
  4. 文件名称:MyThreadPool.h  
  5. 摘    要:任务类和模板实例化线程池类的定义 
  6. 当前版本:1.00  
  7. 作    者:zyq5945@126.com(注意把中文字符换成英文字符)  
  8. 完成日期:2010年6月26日  
  9. 发布Blog:http://blog.csdn.net/zyq5945/   
  10. ======================================================================*/  
  11. #pragma once  
  12. #include "MsgThreadPool.h"  
  13. /*====================================================================== 
  14. 类名称:    CTask 
  15. 类说明:    自定义的测试任务类 
  16.             如果类中有指针或者其他的类的话(深拷贝和浅拷贝), 
  17.             没有把握最好是不要用编译器提供的默认拷贝构造函数和等号操作符 
  18. ======================================================================*/  
  19. class CTask  
  20. {  
  21. public:  
  22.     CTask();  
  23.     CTask(const CTask& rTask);  
  24.     CTask& operator =(const CTask& rTask);  
  25. public:  
  26.     int m_nIndex;  
  27.     SYSTEMTIME m_cTime;  
  28. };  
  29. /*====================================================================== 
  30. 类名称:    class CMyThreadPool : public CMsgThreadPool<CTask> 
  31. 类说明:    具体是线程池类 
  32.             需要在这个类的虚函数DoWork中实现要做的具体工作 
  33.             也可以如此继承 
  34.             typedef CMsgThreadPool<CTask> CCTaskThreadPool; 
  35.             class CMyThreadPool : public CCTaskThreadPool 
  36. ======================================================================*/  
  37. class CMyThreadPool : public CMsgThreadPool<CTask>  
  38. {  
  39. public:  
  40.     CMyThreadPool(void);  
  41.     ~CMyThreadPool(void);  
  42. protected:  
  43.     virtual void DoWork(CTask& rTask);  
  44. };  

 

实现代码很简单,下面是线程池任务处理过程

  1. /*====================================================================== 
  2. 函数名称:   void CMyThreadPool::DoWork(CTask& rTask) 
  3. 函数参数:   T& t     
  4.                 一个需要处理的任务的引用 
  5. 返回值:    无 
  6. 函数说明:   具体的任务处理过程 
  7.             注:请勿保存传递过来的参数指针 
  8. ======================================================================*/  
  9. void CMyThreadPool::DoWork(CTask& rTask)  
  10. {  
  11.     CString strMsg;  
  12.     SYSTEMTIME st;  
  13.     st = rTask.m_cTime;  
  14.       
  15.     strMsg.Format(_T("/tIndex:%08d/t%02d:%02d:%02d.%03d/t/tTID:%08x/n"),  
  16.         rTask.m_nIndex, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, GetCurrentThreadId());  
  17.     // 在调试窗口输出处理的任务  
  18.     OutputDebugString(strMsg);  
  19.     // 模拟线程处理消耗时间  
  20.     DWORD dwSleep = st.wMilliseconds > 500? st.wMilliseconds : 500;  
  21.     Sleep(dwSleep);  
  22. }  

 

2. 在对话框中实例化这个线程池类,并使用

a.添加头文件,本例中是

  1. #include "MyThreadPool.h"  

b.实例化这个线程池类,本例中是添加到类成员变量中

  1. CMyThreadPool m_pool;               // 线程池对象  

c.初始化线程池对象

  1. // 初始化线程池对象  
  2. VERIFY(m_pool.Init());  

注:默认是初始化10个工作线程,你也可以在有空闲线程的时候调用SetThreadNum设置工作线程个数.

d.添加任务到线程池对象中

  1. // 测试加入任务     
  2. SYSTEMTIME st;  
  3. for (int i=0; i<100; i++)  
  4. {     
  5.     CTask cTask;      
  6.     GetLocalTime(&st);    
  7.     st.wMilliseconds = st.wMilliseconds <500?   
  8.         st.wMilliseconds+i : st.wMilliseconds -i;  
  9.     static int s_nIndex = 0;  
  10.     cTask.m_nIndex = s_nIndex++;  
  11.     cTask.m_cTime = st;  
  12.         // 添加任务到线程池对象中  
  13.     m_pool.AddTask(cTask);  
  14. }  

 

在VC6.0中可能会有内存泄露(大小:工作线程个数*sizeof(任务类)),在VS2008SP1中测试没有内存泄露.

需要在各个VS版本测试,请修改模板线程池的析构函数的_MSC_VER宏为对应的VS版本即可.

转自 http://blog.csdn.net/zyq5945/article/details/5697455

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值