<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    使用QueueUserWorkerItem實現的線程池封裝

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    此線程池所依賴的線程類,請參看《一個Windows C++的線程類實現》:

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

     

    SystemThreadPool.h

     

    [cpp] view plaincopy
    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

     

    [cpp] view plaincopy
    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

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全