使用QueueUserWorkerItem实现的线程池封装

转载 2016年06月02日 10:49:02

此线程池所依赖的线程类,请参看《一个Windows C++的线程类实现》:

http://blog.csdn.net/huyiyang2010/archive/2010/08/10/5801597.aspx

 

SystemThreadPool.h

 

  1. #define __SYSTEM_THREAD_POOL__  
  2. #include "Thread.h"  
  3. #include <list>  
  4. #include <windows.h>  
  5. class CThreadPoolExecutor  
  6. {  
  7. public:  
  8.     CThreadPoolExecutor(void);  
  9.     ~CThreadPoolExecutor(void);  
  10.     /** 
  11.       初始化线程池,创建minThreads个线程 
  12.     **/  
  13.     bool Init(unsigned int maxTaskse);  
  14.     /** 
  15.       执行任务,若当前任务列表没有满,将此任务插入到任务列表,返回true 
  16.       否则返回false 
  17.     **/  
  18.     bool Execute(Runnable * pRunnable);  
  19.     /** 
  20.       终止线程池,先制止塞入任务, 
  21.       然后等待直到任务列表为空, 
  22.       然后设置最小线程数量为0, 
  23.       等待直到线程数量为空, 
  24.       清空垃圾堆中的任务 
  25.     **/  
  26.     void Terminate();  
  27.     /** 
  28.       返回线程池中当前的线程数量 
  29.     **/  
  30.     unsigned int GetThreadPoolSize();  
  31. private:  
  32.     static unsigned int WINAPI StaticThreadFunc(void * arg);  
  33. private:  
  34.     typedef std::list<Runnable *> Tasks;  
  35.     typedef Tasks::iterator TasksItr;  
  36.     Tasks m_Tasks;  
  37.     CRITICAL_SECTION m_csTasksLock;  
  38.     volatile bool m_bRun;  
  39.     volatile bool m_bEnableInsertTask;  
  40.     volatile unsigned int m_maxTasks;  
  41. };  
  42. #endif  

 

 

SytemThreadPool.cpp

 

  1. #include "SystemThreadPool.h"  
  2. CThreadPoolExecutor::CThreadPoolExecutor(void) :   
  3. m_bRun(false),  
  4. m_bEnableInsertTask(false)  
  5. {  
  6.     InitializeCriticalSection(&m_csTasksLock);  
  7. }  
  8. CThreadPoolExecutor::~CThreadPoolExecutor(void)  
  9. {  
  10.     Terminate();  
  11.     DeleteCriticalSection(&m_csTasksLock);  
  12. }  
  13. bool CThreadPoolExecutor::Init(unsigned int maxTasks)  
  14. {  
  15.     if(maxTasks == 0)  
  16.     {  
  17.         return false;  
  18.     }  
  19.     m_maxTasks = maxTasks;  
  20.     m_bRun = true;  
  21.     m_bEnableInsertTask = true;  
  22.     return true;  
  23. }  
  24. bool CThreadPoolExecutor::Execute(Runnable * pRunnable)  
  25. {  
  26.     if(!m_bEnableInsertTask)  
  27.     {  
  28.         return false;  
  29.     }  
  30.     if(NULL == pRunnable)  
  31.     {  
  32.         return false;  
  33.     }  
  34.     EnterCriticalSection(&m_csTasksLock);  
  35.     if(m_Tasks.size() >= m_maxTasks)  
  36.     {  
  37.         LeaveCriticalSection(&m_csTasksLock);  
  38.         return false;  
  39.     }  
  40.     m_Tasks.push_back(pRunnable);  
  41.     LeaveCriticalSection(&m_csTasksLock);  
  42.     bool ret = QueueUserWorkItem((LPTHREAD_START_ROUTINE)StaticThreadFunc, this, WT_EXECUTEINPERSISTENTIOTHREAD);  
  43.     if(!ret)  
  44.     {  
  45.         EnterCriticalSection(&m_csTasksLock);  
  46.         m_Tasks.remove(pRunnable);  
  47.         LeaveCriticalSection(&m_csTasksLock);  
  48.     }  
  49.     return ret;  
  50. }  
  51. unsigned int CThreadPoolExecutor::GetThreadPoolSize()  
  52. {  
  53.     return m_Tasks.size();  
  54. }  
  55. void CThreadPoolExecutor::Terminate()  
  56. {  
  57.     m_bEnableInsertTask = false;  
  58.     m_bRun = false;  
  59.     while(m_Tasks.size() != 0)  
  60.     {  
  61.         Sleep(1);  
  62.     }  
  63. }  
  64. unsigned int WINAPI CThreadPoolExecutor::StaticThreadFunc(void * arg)  
  65. {  
  66.     CThreadPoolExecutor * pThreadPool = (CThreadPoolExecutor *)arg;  
  67.     Runnable * pRunnable = NULL;  
  68.     EnterCriticalSection(&pThreadPool->m_csTasksLock);  
  69.     pRunnable = pThreadPool->m_Tasks.front();  
  70.     if(NULL != pRunnable)  
  71.     {  
  72.         pThreadPool->m_Tasks.pop_front();  
  73.     }  
  74.     LeaveCriticalSection(&pThreadPool->m_csTasksLock);  
  75.     if(NULL != pRunnable)  
  76.     {  
  77.         pRunnable->Run();  
  78.     }  
  79.     return 0;  
  80. }  

 

 

用法:

 

#include "Thread.h"
#include "SystemThreadPool.h"

class R : public Runnable
{
public:
    ~R()
    {
    }
    void Run()
    {
        printf("Hello World/n");
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    CThreadPoolExecutor * pExecutor = new CThreadPoolExecutor();
    pExecutor->Init(50);
    R r;
    for(int i=0;i<100;i++)
    {
        while(!pExecutor->Execute(&r))
        {
        }
    }
    pExecutor->Terminate();
    delete pExecutor;
    getchar();
    return 0;
}

 

测试结果:

 

机器:

Intel(R) Core(TM)2 Duo CPU

E8400 @ 3.00GHz

2G内存

对于100个任务并且每个任务包含10000000个循环,任务中无等待:

线程池耗时:2203时间片

 

 

from:http://blog.csdn.net/huyiyang2010/article/details/5820548

Android 多线程 线程池原理 封装线程池

我自己理解看来。线程池顾名思义就是一个容器的意思,需要注意的是,每一个线程都是需要CPU分配资源去执行的。如果由于总是new Thread()开启一个线程,那么就会大量的消耗CPU的资源,导致Andr...
  • xiangyunwan
  • xiangyunwan
  • 2017年05月19日 17:59
  • 1555

浅谈Android线程池封装

Android项目当中经常会出现很多很多的我们需要使用子线程的情况,需要我们异步的加载数据或者实现UI视图和数据的绑定,但是我们又想减少资源的消耗,这个时候我们就需要引入线程池,而且我们的线程池尽量保...
  • qq_29953425
  • qq_29953425
  • 2015年12月29日 19:41
  • 1880

Windows下C++实现线程池功能(固定线程数,自动调整未实现)(

http://blog.sina.com.cn/s/blog_6af95663010158j2.html   #ifndef PUBLIC_H #define PUBLIC_H //测试消息Co...
  • humanbeng
  • humanbeng
  • 2013年07月17日 23:34
  • 1316

使用线程池实现的Http上传下载实现

  • 2013年03月17日 11:56
  • 55KB
  • 下载

c++ 实现线程池的使用

  • 2014年10月15日 12:41
  • 14KB
  • 下载

Qt 线程池(QThreadPool )的使用

  • 2017年12月14日 15:50
  • 4KB
  • 下载

C# 线程池使用示例

  • 2017年12月04日 11:56
  • 30KB
  • 下载

线程池使用样例

  • 2012年09月26日 22:24
  • 76KB
  • 下载

使用LruCache,DiskLruCache结合线程池打造类似(ImageLoader)图片加载器

  • 2016年01月16日 21:42
  • 496KB
  • 下载

JAVA线程池的分析和使用

  • 2015年08月26日 10:09
  • 25KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用QueueUserWorkerItem实现的线程池封装
举报原因:
原因补充:

(最多只允许输入30个字)