天天看點

C++多線程程式設計筆記

windows系統為我們提供了相關api,我們可以使用它們來進行多線程程式設計。

建立線程的函數:

最簡單的c++多線程程式:

運作上面的程式會發現有些時候輸出了換行,有些時候則沒有輸出換行,也有的時候輸出了兩個換行。這是因為多線程的程式是并發地運作的,多個線程之間如果共用了一些資源的話,并不能保證這些資源都能被正确地利用,因為資源并不是獨占的。可以對程式做如下兩種改進:

使用互斥體

使用臨界區

win32 提供了一系列的api函數來完成線程的建立、挂起、恢複、終結以及通信等工作。

該函數在其調用程序的程序空間裡建立一個新的線程,并傳回已建線程的句柄,其中各參數說明如下:

lpthreadattributes:指向一個 security_attributes 結構的指針,該結構決定了線程的安全屬性,一般置為 null;

dwstacksize:指定了線程的堆棧深度,一般都設定為0;

lpstartaddress:表示新線程開始執行時代碼所在函數的位址,即線程的起始位址。一般情況為(lpthread_start_routine)threadfunc,threadfunc 是線程函數名;

lpparameter:指定了線程執行時傳送給線程的32位參數,即線程函數的參數;

dwcreationflags:控制線程建立的附加标志,可以取兩種值。如果該參數為0,線程在被建立後就會立即開始執行;如果該參數為create_suspended,則系統産生線程後,該線程處于挂起狀态,并不馬上執行,直至函數resumethread被調用;

lpthreadid:該參數傳回所建立線程的id; 如果建立成功則傳回線程的句柄,否則傳回null。

該函數用于挂起指定的線程,如果函數執行成功,則線程的執行被終止。

該函數用于結束線程的挂起狀态,執行線程。

該函數用于線程終結自身的執行,主要線上程的執行函數中被調用。其中參數dwexitcode用來設定線程的退出碼。

一般情況下,線程運作結束之後,線程函數正常傳回,但是應用程式可以調用terminatethread強行終止某一線程的執行。各參數含義如下:

hthread:将被終結的線程的句柄;

dwexitcode:用于指定線程的退出碼。

使用terminatethread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的執行,但并不釋放線程所占用的資源。是以,一般不建議使用該函數。

該函數将一條消息放入到指定線程的消息隊列中,并且不等到消息被該線程處理時便傳回。

idthread:将接收消息的線程的id;

msg:指定用來發送的消息;

wparam:同消息有關的字參數;

lparam:同消息有關的長參數;

調用該函數時,如果即将接收消息的線程沒有建立消息循環,則該函數執行失敗。