欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一種類(lèi)似JAVA線程池的C++線程池實(shí)現(xiàn)方法

 更新時(shí)間:2019年07月24日 10:48:01   投稿:mrr  
線程池(thread pool)是一種線程使用模式。線程過(guò)多或者頻繁創(chuàng)建和銷(xiāo)毀線程會(huì)帶來(lái)調(diào)度開(kāi)銷(xiāo),進(jìn)而影響緩存局部性和整體性能。這篇文章主要介紹了一種類(lèi)似JAVA線程池的C++線程池實(shí)現(xiàn)方法,需要的朋友可以參考下

什么是線程池

線程池(thread pool)是一種線程使用模式。線程過(guò)多或者頻繁創(chuàng)建和銷(xiāo)毀線程會(huì)帶來(lái)調(diào)度開(kāi)銷(xiāo),進(jìn)而影響緩存局部性和整體性能。而線程池維護(hù)著多個(gè)線程,等待著管理器分配可并發(fā)執(zhí)行的任務(wù)。這避免了在處理短時(shí)間任務(wù)時(shí)創(chuàng)建與銷(xiāo)毀線程的代價(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++線程池類(lèi)庫(kù)。

       該類(lèi)庫(kù)代碼已上傳至github倉(cāng)庫(kù)中,下載地址為:https://github.com/xiaoba-8/mixthread

       該類(lèi)庫(kù)中主要的類(lèi)的關(guān)系如下圖所示:

線程池類(lèi)圖

       其中,IRuanble為接口類(lèi),類(lèi)似JAVA中的Runnable接口;

       DefulatMutext 為訪問(wèn)互斥體類(lèi),用于臨界資源時(shí)的加解鎖;

       RootThread為線程實(shí)現(xiàn)的基類(lèi),定義了線程中的通用的方法;

       CommonThread為一個(gè)簡(jiǎn)單的線程實(shí)現(xiàn)類(lèi),類(lèi)似于JAVA中的Thread類(lèi);

       DefaultThread類(lèi)為另一線程實(shí)現(xiàn)類(lèi),以IRunnable為參數(shù),可將IRunnable轉(zhuǎn)化為線程;

ThreadPool為線程池實(shí)現(xiàn)類(lèi),類(lèi)似JAVA中的ThreadPool類(lèi)。

類(lèi)庫(kù)的安裝方法

1.     下載類(lèi)庫(kù)實(shí)現(xiàn)源代碼:https://github.com/xiaoba-8/mixthread

2.     進(jìn)入類(lèi)庫(kù)根文件夾依次執(zhí)行configure,make, make install

類(lèi)庫(kù)的使用方法

與JAVA線程池的使用方式相似,首先創(chuàng)建實(shí)現(xiàn)IRunnable接口的類(lèi),然后交由ThreadPool類(lèi)實(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é)

以上所述是小編給大家介紹的一種類(lèi)似JAVA線程池的C++線程池實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Security中的@PostAuthorize、@PreFilter和@PostFilter詳解

    Security中的@PostAuthorize、@PreFilter和@PostFilter詳解

    這篇文章主要介紹了Security中的@PostAuthorize、@PreFilter和@PostFilter詳解,@PostAuthorize是在方法調(diào)用完成后進(jìn)行權(quán)限檢查,它不能控制方法是否能被調(diào)用,只能在方法調(diào)用完成后檢查權(quán)限決定是否要拋出AccessDeniedException,需要的朋友可以參考下
    2023-11-11
  • tio-boot?jfinal-plugins框架整合redis示例詳解

    tio-boot?jfinal-plugins框架整合redis示例詳解

    這篇文章主要為大家介紹了tio-boot?jfinal-plugins框架整合redis示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • java短路邏輯運(yùn)算符實(shí)例用法詳解

    java短路邏輯運(yùn)算符實(shí)例用法詳解

    在本篇文章里小編給大家分享的是一篇關(guān)于java短路邏輯運(yùn)算符實(shí)例用法內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-04-04
  • Servlet從入門(mén)到精通(超級(jí)詳細(xì)!)

    Servlet從入門(mén)到精通(超級(jí)詳細(xì)!)

    在JavaWeb項(xiàng)目中,處理請(qǐng)求和發(fā)送響應(yīng)的過(guò)程是由一種叫做Servlet 的程序來(lái)完成的,并且 Servlet 是為了解決實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面而衍生的東西,下面這篇文章主要給大家介紹了關(guān)于Servlet從入門(mén)到精通的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 解決idea中servlet報(bào)紅問(wèn)題

    解決idea中servlet報(bào)紅問(wèn)題

    這篇文章主要介紹了解決idea中servlet報(bào)紅問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • MyBatis 中 ${}和 #{}的正確使用方法(千萬(wàn)不要亂用)

    MyBatis 中 ${}和 #{}的正確使用方法(千萬(wàn)不要亂用)

    這篇文章主要介紹了MyBatis 中 ${}和 #{}的正確使用方法,本文給大家提到了MyBatis 中 ${}和 #{}的區(qū)別,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java使用@Validated注解進(jìn)行參數(shù)驗(yàn)證的方法

    Java使用@Validated注解進(jìn)行參數(shù)驗(yàn)證的方法

    這篇文章主要介紹了Java使用@Validated注解進(jìn)行參數(shù)驗(yàn)證的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java中的基礎(chǔ)運(yùn)算符

    java中的基礎(chǔ)運(yùn)算符

    這篇文章主要介紹了Java基本數(shù)據(jù)類(lèi)型和運(yùn)算符,結(jié)合實(shí)例形式詳細(xì)分析了java基本數(shù)據(jù)類(lèi)型、數(shù)據(jù)類(lèi)型轉(zhuǎn)換、算術(shù)運(yùn)算符、邏輯運(yùn)算符等相關(guān)原理與操作技巧,需要的朋友可以參考下
    2021-08-08
  • 一文帶你搞懂Java單例模式

    一文帶你搞懂Java單例模式

    單例就是單實(shí)例的意思,即在系統(tǒng)全局,一個(gè)類(lèi)只創(chuàng)建一個(gè)對(duì)象,并且在系統(tǒng)全局都可以訪問(wèn)這個(gè)對(duì)象而不用重新創(chuàng)建。本文將通過(guò)示例為大家詳細(xì)講解Java單例模式的使用,需要的可以參考一下
    2022-11-11
  • Springcloud Nacos基本操作代碼實(shí)例

    Springcloud Nacos基本操作代碼實(shí)例

    這篇文章主要介紹了Springcloud Nacos基本操作代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論