C 中多執行緒程式設計

2021-06-16 03:00:51 字數 3325 閱讀 4832

2. threadpool

執行緒池(threadpool)是一種相對較簡單的方法,它適應於一些需要多個執行緒而又較短任務(如一些常處於阻塞狀態的執行緒) ,它的缺點是對建立的執行緒不能加以控制,也不能設定其優先順序。由於每個程序只有乙個執行緒池,當然每個應用程式域也只有乙個執行緒池(對線),所以你將發現threadpool類的成員函式都為static! 當你首次呼叫threadpool.queueuserworkitem、threadpool.registerwaitforsingleobject等,便會建立執行緒池例項。下面我就執行緒池當中的兩函式作一介紹:

[c#]

public static bool queueuserworkitem( //呼叫成功則返回true

waitcallback callback,//要建立的執行緒呼叫的委託

object state //傳遞給委託的引數

)//它的另乙個過載函式類似,只是委託不帶引數而已

此函式的作用是把要建立的執行緒排隊到執行緒池,當執行緒池的可用執行緒數不為零時(執行緒池有建立執行緒數的限制,缺身值為25),便建立此執行緒,否則就排隊到執行緒池等到它有可用的執行緒時才建立。

[c#]

public static registeredwaithandle registerwaitforsingleobject(

waithandle waitobject,// 要註冊的 waithandle

waitortimercallback callback,// 執行緒呼叫的委託

object state,//傳遞給委託的引數

int timeout,//超時,單位為毫秒,

bool executeonlyonce file://是/否只執行一次

); public delegate void waitortimercallback(

object state,//也即傳遞給委託的引數

bool timedout//true表示由於超時呼叫,反之則因為waitobject

); 此函式的作用是建立乙個等待執行緒,一旦呼叫此函式便建立此執行緒,在引數waitobject變為終止狀態或所設定的時間timeout到了之前,它都處於「阻塞」狀態,值得注意的一點是此「阻塞」與thread的waitsleepjoin狀態有很大的不同:當某thread處於waitsleepjoin狀態時cpu會定期的喚醒它以輪詢更新狀態資訊,然後再次進入waitsleepjoin狀態,執行緒的切換可是很費資源的;而用此函式建立的執行緒則不同,在觸發它執行之前,cpu不會切換到此執行緒,它既不占用cpu的時間又不浪費執行緒切換時間,但cpu又如何知道何時執行它?實際上執行緒池會生成一些輔助線程用來監視這些觸發條件,一旦達到條件便啟動相應的執行緒,當然這些輔助線程本身也占用時間,但是如果你需建立較多的等待執行緒時,使用執行緒池的優勢就越加明顯。見下例:

static autoresetevent ev=new autoresetevent(false);

public static int main(string args)

public static void threadfunc(object b)

",b);

for(int i=0;i<2;i++) }

public static void waitthreadfunc(object b,bool t)

,t is ",b,t);

} 其執行結果為:

the object is 8

the object is 4,t is false

the object is 4,t is false

the object is 4,t is true

the object is 4,t is true

the object is 4,t is true

從以上結果我們可以看出執行緒threadfunc執行了1次,而waitthreadfunc執行了5次。我們可以從waitortimercallback中的bool t引數判斷啟動此執行緒的原因:t為false,則表示由於waitobject,否則則是由於超時。另外我們也可以通過object b向執行緒傳遞一些引數。

3. timer

它適用於需週期性呼叫的方法,它不在建立計時器的執行緒中執行,它在由系統自動分配的單獨執行緒中執行。這和win32中的settimer方法類似。它的構造為:

[c#]

public timer(

timercallback callback,//所需呼叫的方法

object state,//傳遞給callback的引數

int duetime,//多久後開始呼叫callback

int period//呼叫此方法的時間間隔

);// 如果 duetime 為0,則 callback 立即執行它的首次呼叫。如果 duetime 為 infinite,則 callback 不呼叫它的方法。計時器被禁用,但使用 change 方法可以重新啟用它。如果 period 為0或 infinite,並且 duetime 不為 infinite,則 callback 呼叫它的方法一次。計時器的定期行為被禁用,但使用 change 方法可以重新啟用它。如果 period 為零 (0) 或 infinite,並且 duetime 不為 infinite,則 callback 呼叫它的方法一次。計時器的定期行為被禁用,但使用 change 方法可以重新啟用它。

在建立計時器之後若想改變它的period和duetime,我們可以通過呼叫timer的change方法來改變:

[c#]

public bool change(

int duetime,

int period

);//顯然所改變的兩個引數對應於timer中的兩引數

見下例:public static int main(string args)

public static void timercall(object b)

",b);

} 其執行結果為:

period is 1000

timercallback;b is 3

timercallback;b is 3

period is 500

timercallback;b is 3

timercallback;b is 3

timercallback;b is 3

timercallback;b is 3

總結 從以上的簡單介紹,我們可以看出它們各自使用的場合:thread適用於那些需對執行緒進行複雜控制的場合;threadpool適應於一些需要多個執行緒而又較短任務(如一些常處於阻塞狀態的執行緒);timer則適用於那些需週期性呼叫的方法。只要我們了解了它們的使用特點,我們就可以很好的選擇合適的方法。

C 多執行緒程式設計

一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...

C 多執行緒程式設計

乙個程序通常定義為程式的乙個例項。在win32中,程序佔據4gb的位址空間。與它們在ms dos和16位windows作業系統中不同,win32程序是沒有活力的。這就是說,乙個win32程序並不執行什麼指令,它只是佔據著4gb的位址空間,此空間中有應用程式exe檔案的 和資料。exe需要的任意dll...

C 多執行緒程式設計

建立執行緒的函式 handle createthread lpsecurity attributes lpthreadattributes,使用預設安全形態,設為null,表明不可被子執行緒繼承 size t dwstacksize,初始棧大小,預設值0表示使用與呼叫該函式的執行緒相同的棧大小 lp...