一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法
什么是線程池
線程池(thread pool)是一種線程使用模式。線程過(guò)多或者頻繁創(chuàng)建和銷毀線程會(huì)帶來(lái)調(diào)度開(kāi)銷,進(jìn)而影響緩存局部性和整體性能。而線程池維護(hù)著多個(gè)線程,等待著管理器分配可并發(fā)執(zhí)行的任務(wù)。這避免了在處理短時(shí)間任務(wù)時(shí)創(chuàng)建與銷毀線程的代價(jià),以及保證了線程的可復(fù)用性。線程池不僅能夠保證內(nèi)核的充分利用,還能防止過(guò)分調(diào)度。
線程池的實(shí)現(xiàn)
線程池在JAVA平臺(tái)上已經(jīng)有成熟的實(shí)現(xiàn)方式,本文介紹參考JAVA線程池實(shí)現(xiàn)方式實(shí)現(xiàn)的C++線程池類庫(kù)。
該類庫(kù)代碼已上傳至github倉(cāng)庫(kù)中,下載地址為:https://github.com/xiaoba-8/mixthread
該類庫(kù)中主要的類的關(guān)系如下圖所示:

線程池類圖
其中,IRuanble為接口類,類似JAVA中的Runnable接口;
DefulatMutext 為訪問(wèn)互斥體類,用于臨界資源時(shí)的加解鎖;
RootThread為線程實(shí)現(xiàn)的基類,定義了線程中的通用的方法;
CommonThread為一個(gè)簡(jiǎn)單的線程實(shí)現(xiàn)類,類似于JAVA中的Thread類;
DefaultThread類為另一線程實(shí)現(xiàn)類,以IRunnable為參數(shù),可將IRunnable轉(zhuǎn)化為線程;
ThreadPool為線程池實(shí)現(xiàn)類,類似JAVA中的ThreadPool類。
類庫(kù)的安裝方法
1. 下載類庫(kù)實(shí)現(xiàn)源代碼:https://github.com/xiaoba-8/mixthread
2. 進(jìn)入類庫(kù)根文件夾依次執(zhí)行configure,make, make install
類庫(kù)的使用方法
與JAVA線程池的使用方式相似,首先創(chuàng)建實(shí)現(xiàn)IRunnable接口的類,然后交由ThreadPool類實(shí)例進(jìn)行調(diào)度即可以。
以下按示例代碼:
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í)行以下命令進(jìn)行編譯,(假設(shè)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í)行結(jié)果
執(zhí)行 ./mix_thread_demo, 顯示如下結(jié)果
./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
總結(jié)
以上所述是小編給大家介紹的一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- C++線程池的簡(jiǎn)單實(shí)現(xiàn)方法
- c++版線程池和任務(wù)池示例
- c++實(shí)現(xiàn)簡(jiǎn)單的線程池
- c++實(shí)現(xiàn)簡(jiǎn)單的線程池
- c++線程池實(shí)現(xiàn)方法
- C++11 簡(jiǎn)單實(shí)現(xiàn)線程池的方法
- 基于C++11實(shí)現(xiàn)手寫(xiě)線程池的示例代碼
- 基于C++17實(shí)現(xiàn)的手寫(xiě)線程池
- C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線程池的示例代碼
- 使用C++實(shí)現(xiàn)一個(gè)高效的線程池
- C++實(shí)現(xiàn)一個(gè)簡(jiǎn)易線程池的使用小結(jié)
相關(guān)文章
使用SpringBoot-JPA進(jìn)行自定義保存及批量保存功能
這篇文章主要介紹了使用SpringBoot-JPA進(jìn)行自定義的保存及批量保存功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
Java二分查找算法實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java二分查找算法實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Spring Cloud Alibaba使用Sentinel實(shí)現(xiàn)接口限流
這篇文章主要介紹了Spring Cloud Alibaba使用Sentinel實(shí)現(xiàn)接口限流,本文詳細(xì)的介紹了Sentinel組件的用法以及接口限流,感興趣的可以了解一下2019-04-04
Spring Batch讀取txt文件并寫(xiě)入數(shù)據(jù)庫(kù)的方法教程
這篇文章主要給大家介紹了Spring Batch讀取txt文件并寫(xiě)入數(shù)據(jù)庫(kù)的方法,SpringBatch 是一個(gè)輕量級(jí)、全面的批處理框架。這里我們用它來(lái)實(shí)現(xiàn)文件的讀取并將讀取的結(jié)果作處理,處理之后再寫(xiě)入數(shù)據(jù)庫(kù)中的功能。需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-04-04

