本線程池的作用是管理阻塞的網絡操作函數的調用...每次網絡操作調用都加入到線程池當中,然後線程回調函數執行 取任務的操作並執行這次任務。
線程池的設計
將線程池的所有操作都封裝在類中...外界使用的話只需要new 一個這個線程池對象。
1.加任務函數
2.取任務函數
3.初始化線程池
4.銷燬線程池
線程池的實現
實現跨平臺線程池需要了解平臺相關的線程庫,linux一般採用posix標準的線程庫(大部分使用於ios,android),windows則採用windows.h 下的線程相關函數.
1.信號量
爲了控制線程訪問,可以採用信號量來協調線程的訪問線程競爭資源的順序。
linux 採用 sem_t ,sem_init,sem_wait,sem_post來實現
windows採用WaitForSingleObject,ReleaseSemaphore來實現
2.互斥鎖
linux 採用pthread_mutex_t,pthread_mutex_lock,pthread_mutex_unlock
windows採用CRITICAL_SECTION,InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection
3.對於線程池的任務其回調函數是一直在執行操作直到線程被關閉,或者程序終止,進程終止
4.資源的訪問控制
(1)對於信號量初始值應該將可用資源設置爲0
(2)當用戶向線程池中加入task時,信號量加1,表示可用資源加1.
(3)線程回調函數提取任務,若任務>0則提取任務並執行,若<=0則wait
5.線程池銷燬,可以在主線程中調用線程池釋放資源函數並強制關閉線程池。如果線程池的生命週期是整個進程或者程序的生命週期,可以利用系統回收。
線程池的工作流程:
首先需要明確的是線程池中的競爭資源...生產資源,消費資源...在線程池中 這兩者分別是,任務進隊列,線程執行隊列中的任務,這裏就設置兩個資源標識,A代表生產任務線程,B代表執行任務線程。 採用信號量來同步多個線程(linux 和windows 與 移動平臺 線程同步方式不同,移動平臺不能直接使用sem_t ,平臺不支持)生產資源時需要等待 可用的線程來生產資源, 資源隊列需要加鎖,消費資源時需要等待生產任務線程。