一種類似JAVA線程池的C++線程池實現(xiàn)方法
什么是線程池
線程池(thread pool)是一種線程使用模式。線程過多或者頻繁創(chuàng)建和銷毀線程會帶來調度開銷,進而影響緩存局部性和整體性能。而線程池維護著多個線程,等待著管理器分配可并發(fā)執(zhí)行的任務。這避免了在處理短時間任務時創(chuàng)建與銷毀線程的代價,以及保證了線程的可復用性。線程池不僅能夠保證內核的充分利用,還能防止過分調度。
線程池的實現(xiàn)
線程池在JAVA平臺上已經(jīng)有成熟的實現(xiàn)方式,本文介紹參考JAVA線程池實現(xiàn)方式實現(xiàn)的C++線程池類庫。
該類庫代碼已上傳至github倉庫中,下載地址為:https://github.com/xiaoba-8/mixthread
該類庫中主要的類的關系如下圖所示:
線程池類圖
其中,IRuanble為接口類,類似JAVA中的Runnable接口;
DefulatMutext 為訪問互斥體類,用于臨界資源時的加解鎖;
RootThread為線程實現(xiàn)的基類,定義了線程中的通用的方法;
CommonThread為一個簡單的線程實現(xiàn)類,類似于JAVA中的Thread類;
DefaultThread類為另一線程實現(xiàn)類,以IRunnable為參數(shù),可將IRunnable轉化為線程;
ThreadPool為線程池實現(xiàn)類,類似JAVA中的ThreadPool類。
類庫的安裝方法
1. 下載類庫實現(xiàn)源代碼:https://github.com/xiaoba-8/mixthread
2. 進入類庫根文件夾依次執(zhí)行configure,make, make install
類庫的使用方法
與JAVA線程池的使用方式相似,首先創(chuàng)建實現(xiàn)IRunnable接口的類,然后交由ThreadPool類實例進行調度即可以。
以下按示例代碼:
1. 創(chuàng)建demo_main.cpp文件,代碼如下:
#include <stdio.h> #include <mix/thread/ThreadPool.h> class DemoThread : public mix::IRunnable { private: int id; public: DemoThread(int id) { this->id = id; } virtual void Run() { for (int i = 0; i < 3; i++) { usleep(500); printf("Thread %d: loop index %d\n", id, i); } } virtual bool IsDelete () { return true; } virtual int Priority() { return 0; } virtual void SetPriority(int priority) { } virtual void Cancel() { } virtual bool IsCanceled() { return false; } virtual void Pause() {} virtual void Resume() {} virtual bool IsPaused() { return false; } virtual std::string GetTaskId() { return ""; } virtual void TryPause() { } }; int main(int argc, char *argv[]) { mix::ThreadPool threadPool(10, 20, 5); printf("Mix Thread Begin\n"); for (int i = 0; i < 5; i++) { threadPool.Execute(new DemoThread(i)); } sleep(1); while (threadPool.GetActiveCount() > 0) { sleep(1); } printf("Mix Thread End\n"); return 0; }
2. 執(zhí)行以下命令進行編譯,(假設mixthread安裝在/usr/local目錄下)
g++ -I/usr/local/include -g -O2 demo_main.cpp -pthread -o mix_thread_demo -lmixthread -pthread -Wl,-rpath -Wl,/usr/local/lib
生成執(zhí)行程序mix_thread_demo
3. 執(zhí)行結果
執(zhí)行 ./mix_thread_demo, 顯示如下結果
./mix_thread_demo Mix Thread Begin Thread 3: loop index 0 Thread 4: loop index 0 Thread 2: loop index 0 Thread 1: loop index 0 Thread 0: loop index 0 Thread 4: loop index 1 Thread 3: loop index 1 Thread 2: loop index 1 Thread 1: loop index 1 Thread 0: loop index 1 Thread 4: loop index 2 Thread 3: loop index 2 Thread 2: loop index 2 Thread 1: loop index 2 Thread 0: loop index 2 Mix Thread End
總結
以上所述是小編給大家介紹的一種類似JAVA線程池的C++線程池實現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
相關文章
Security中的@PostAuthorize、@PreFilter和@PostFilter詳解
這篇文章主要介紹了Security中的@PostAuthorize、@PreFilter和@PostFilter詳解,@PostAuthorize是在方法調用完成后進行權限檢查,它不能控制方法是否能被調用,只能在方法調用完成后檢查權限決定是否要拋出AccessDeniedException,需要的朋友可以參考下2023-11-11tio-boot?jfinal-plugins框架整合redis示例詳解
這篇文章主要為大家介紹了tio-boot?jfinal-plugins框架整合redis示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12MyBatis 中 ${}和 #{}的正確使用方法(千萬不要亂用)
這篇文章主要介紹了MyBatis 中 ${}和 #{}的正確使用方法,本文給大家提到了MyBatis 中 ${}和 #{}的區(qū)別,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Java使用@Validated注解進行參數(shù)驗證的方法
這篇文章主要介紹了Java使用@Validated注解進行參數(shù)驗證的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08