C 自己實現執行緒池功能 一

2021-06-26 11:03:03 字數 2859 閱讀 2071

在物件導向程式設計中,建立和銷毀物件是很費時間的,因為建立乙個物件要獲取記憶體資源或者其它更多資源,

所以提高服務程式效率的乙個手段就是盡可能減少建立和銷毀物件的次數,特別是一些很耗資源的物件建立和銷毀。如何利用已有物件來服務就是乙個需要解決的關鍵問題,其實這就是一些"池化資源"技術產生的原因。比如大家所熟悉的資料庫連線池正是遵循這一思想而產生的,本文將介紹的執行緒池技術同樣符合這一思想。

我所提到伺服器程式是指能夠接受客戶請求並能處理請求的程式,而不只是指那些接受網路客戶請求的網路伺服器程式。

多執行緒技術主要解決處理器單元內多個執行緒執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。但如果對多執行緒應用不當,會增加對單個任務的處理時間。可以舉乙個簡單的例子:

假設在一台伺服器完成一項任務的時間為t

t1 建立執行緒的時間

t3 執行緒銷毀的時間

顯然t = t1+t2+t3。注意這是乙個極度簡化的假設。

可以看出t1,t3是多執行緒本身的帶來的開銷,我們渴望減少t1,t3所用的時間,從而減少t的時間。但一些執行緒的使用者並沒有注意到這一點,所以在程式中頻繁的建立或銷毀執行緒,這導致t1和t3在t中占有相當比例。顯然這是突出了執行緒的弱點(t1,t3),而不是優點(併發性)。

執行緒池技術正是關注如何縮短或調整t1,t3時間的技術,從而提高伺服器程式效能的。它把t1,t3分別安排在伺服器程式的啟動和結束的時間段或者一些空閒的時間段,這樣在伺服器程式處理客戶請求時,不會有t1,t3的開銷了。

執行緒池不僅調整t1,t3產生的時間段,而且它還顯著減少了建立執行緒的數目。在看乙個例子:

這些都是假設,不能充分說明問題,下面我將討論執行緒池的簡單實現並對該程式進行對比測試,以說明執行緒技術優點及應用領域。

一般乙個簡單執行緒池至少包含下列組成部分。

執行緒池管理器(threadpoolmanager):用於建立並管理執行緒池

工作執行緒(workthread): 執行緒池中線程

任務介面(task):每個任務必須實現的介面,以供工作執行緒排程任務的執行。

任務佇列:用於存放沒有處理的任務。提供一種緩衝機制。

接下來我演示了乙個 最簡單的執行緒池。沒有進行任何優化的。

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.collections;

using system.threading;

namespace threadmanager

//預設執行緒數量

public int defaultthreadnum

private queuetaskqueue;

private queueworkthreadlist;

public threadpoolmanager(int i)

public threadpoolmanager():this(10)

public bool isalltaskfinish()

public void createthreadpool(int i)}}

public void addtask(task task)

}public void closethread()

catch (exception)

break;}}

}}

工作執行緒類

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading;

namespace threadmanager

private bool flag;

private queuetaskqueue;

private task task;

public workthread(ref queuequeue, int i)

public void run()

catch (exception)

if (task == null)

continue;

}try

catch (exception)

try}

catch (exception)

}//end of while

}public void closethread()

catch (exception)}}

}

task類和實現類

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace threadmanager

}using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading;

namespace threadmanager

public void starttask()

public void endtask()

public bool isend()

public void run()}}

}

這個簡單的模型存在的問題是,很多時候獲取task都是在不斷的嘗試,使得效能降的很低,需要改進的方法是增加乙個 訊號量的機制,不讓程式空轉!

c 執行緒池實現(四)執行緒池實現

前面已經說到了同步佇列的實現,下面來看執行緒池的實現。ifndef include threadpool define include threadpool include include include include include syncqueue.hpp namespace mythrea...

c 實現執行緒池

執行緒池 簡單地說,執行緒池 就是預先建立好一批執行緒,方便 快速地處理收到的業務。比起傳統的到來乙個任務,即時建立乙個執行緒來處理,節省了執行緒的建立和 的開銷,響應更快,效率更高。在linux中,使用的是posix執行緒庫,首先介紹幾個常用的函式 1 執行緒的建立和取消函式 pthread cr...

C 執行緒池實現

最近在學習stanford的cs149課程,這個課程是有關平行計算的,講了很多很有用的知識,在做程式設計作業的過程中也遇到了很多困難,看了很多資料,我將它們整理出來,以後看也方便一些。執行緒池的具體實現就是將執行緒提前建立好放入vector等容器中,等到有任務的時候就執行緒就取出任務執行,沒有任務就...