Linux C 乙個執行緒池的簡單實現

2021-06-03 22:20:57 字數 1570 閱讀 5376

這是對pthread執行緒的乙個簡單應用 1.

實現了執行緒池的概念,執行緒可以重複使用。 2.

對訊號量,互斥鎖等進行封裝,業務處理函式中只需寫和業務相關的**。 3.

移植性好。如果想把這個執行緒池**應用到自己的實現中去,只要寫自己的業務處理函式和改寫工作佇列資料的處理方法就可以了。

sample**主要包括乙個主程式和兩個執行緒實現類

threadtest.cpp:主程式

cthreadmanager:執行緒管理class,執行緒池的實現類

cthread:執行緒class.

主程式實現方法。 1.

實現main函式和乙個需要執行緒處理的業務函式(例子**中業務函式是乙個簡單的計算函式count)。在main函式中建立cthreadmanager的例項,產生執行緒池。這個時候,把業務函式作為函式指標傳到cthreadmanager裡面,最終會被執行緒呼叫。 2.

向工作佇列中放入業務函式要處理的資料。 3.

設定訊號量,喚醒執行緒。

--> 1 // 執行緒要執行的函式

int count(int nwork)

int main()

cthreadmanager實現的方法

1. 把訊號量和互斥鎖等封裝成自己的函式

2. 在new方法裡,迴圈呼叫cthread的new方法,啟動一定數量(可設定)的執行緒,產生執行緒池。

3. 這些執行緒啟動後,就會執行cthreadmanager中的managefuction函式。這個函式是無限迴圈的,保證了執行緒在整個程式的生命週期中不銷毀。

4. 在迴圈處理裡面,第一行**就是等待乙個訊號量,這個訊號量是由主程式進行設定的,這個訊號訊號量如果沒有被設定(代表暫時沒有需要處理的工作),所有執行緒都在這裡阻塞著。 4.

一旦訊號量被設定,根據linux執行緒排程機制,在阻塞的執行緒佇列中,其中乙個執行緒被喚醒,可以執行後面的**。 5.

從工作佇列中取出要進行處理的資料(使用互斥鎖進行排他) 6.

通過函式指標呼叫main函式傳過來的業務函式,處理資料。 7.

業務函式執行完之後,執行緒進入下乙個迴圈,等待新的訊號量。

code highlighting produced by actipro codehighlighter (freeware)

-->class cthreadmanager ;

// 執行緒執行函式,它只是個殼子,處理訊號量和互斥鎖等,

// 最後呼叫main函式傳過來的執行緒執行函式來實現業務處理

void* managefuction(void* argv)

return 0;

}

cthread實現的方法

cthreadmanager比較簡單,封裝了建立執行緒和join執行緒的函式。

code highlighting produced by actipro codehighlighter (freeware)

-->cthread::cthread(void* (*threadfuction)(void*),void* threadargv)

執行緒池(一) 實現乙個簡單的執行緒池

我們知道頻繁的建立 銷毀執行緒是不可取的,為了減少建立和銷毀執行緒的次數,讓每個執行緒可以多次使用,我們就可以使用執行緒池,可以降低資源到的消耗。執行緒池裡面肯定有多個執行緒,那麼我們就簡單的用乙個陣列來儲存執行緒,那我們我們預設裡面有 5 個執行緒。那我們執行緒池裡只有五個執行緒能同時工作,那同時...

乙個簡單的執行緒池

話說這個執行緒池也寫了好久了 做簡單的東西的時候也在用,最近因為乙個失誤刪掉了自己的一些檔案導致重新寫了一遍 所以貼出來,以防萬一 並且跟大佬們交流 created by cxhmyself on 18 4 10.include 都需要與互斥量一起才能工作 include include inclu...

乙個簡單的執行緒池

最近自己,很煩所以超級久沒學習了,今天趁著抗戰七十周年放三天假,趕緊看下書。廢話不多說。今天,介紹乙個簡單的執行緒池。首先說明什麼是執行緒池,執行緒池 是包含若干個執行緒,來處理多個任務的執行緒集合。它的目的是用來處理,大量的相對短暫的任務。這裡我們先來解釋下兩個概念,什麼叫大量呢?對於執行緒來說,...