C C 多執行緒入門

2021-07-05 03:28:58 字數 2280 閱讀 6625

在學習多執行緒程式設計之前, 必須先知道什麼是 執行緒函式, 執行緒函式就是另乙個執行緒的入口函式. 預設情況下乙個我們所寫的**都是只有乙個執行緒的, 而這個執行緒的入口函式就是main() 函式, 這是系統預設的. 而我們建立的另乙個執行緒也需要乙個函式來進入, 這個函式就叫做執行緒函式.

在c/c++中, 可以呼叫 '執行期庫' 函式 _beginthreadex(...), 來建立乙個執行緒, _beginthreadex(...)函式接受6個引數, 其中第3個引數要求傳入該執行緒的入口函式的位址(即:傳入執行緒函式的函式名+&即可), 其它的每個引數的意思可以在msdn或網上查一下, 入門的話其餘引數全部傳0即可.

_beginthreadex(...)函式返回乙個控制代碼, 就是新執行緒的控制代碼. 對於傳入的執行緒函式是有要求的, 執行緒函式必須返回 unsigned __stdcall 型別, 並且接受乙個 void* 型引數, 函式的內容就可以自己定了.

先來段多執行緒的簡單**:

#include#include#includeusing

namespace std;

bool stop;

unsigned counter;

unsigned __stdcall thread(void*)

int main()

**是正確的, 複製貼上到 visual c++ 6.0 中, 即可編譯執行. 但是會發現 _beginthreadex(...) 函式未定義的編譯錯誤. 原因是因為我們的visual c++ 6.0 預設的是在單執行緒模式下程式設計, 如果需要進行多執行緒程式設計, 需要轉換一下編譯器的 '執行期庫' , 方法很簡單: 

project --> settings --> c/c++ 中 選擇 category 中的 code generation , 然後在 use run-time library 裡面選含有multithread的其中乙個就可以了.

這時再編譯, 就可以通過了. 有了這個例子的函式, 現在應該已經入門了吧. 不過除了這個還有很多基礎知識要補上, 推薦通讀幾遍 的第6章.

實際上, 在不同的編譯環境下, _beginthreadex(...)函式可能會有不同的名稱, 但是它們都是對 windows函式 createthread(...) 的封裝, createthread(...)函式用來建立乙個新的執行緒函式, createthread(...)函式同樣接受6個引數, 在類似 _beginthreadex(...)的函式中對其做了一些安全的處理, 如堆疊記憶體的申請等. 雖然可以用createthread函式來建立乙個新的執行緒, 但是強烈建議使用 _beginthreadex(...)函式, 對於createthread 函式在第6章中有很好的講解.

當乙個執行緒的任務結束, 要退出時, 有四種方法:

1.執行緒函式返回(最好使用這種方法);

2.通過呼叫 _endthreadex()或 exitthread()函式,執行緒將自行撤消(最好不要使用這種方法);

3.同乙個程序或另乙個程序中的執行緒呼叫 terminatethread()函式(應該避免使用這種方法);

4.包含執行緒的程序終止執行(應該避免使用這種方法).

最好通過其入口函式的返回語句(即:return)來退出執行緒, 也可以通過呼叫 c/c++ '執行期庫'函式 _endthreadex()函式來退出, 還有兩種退出的方法, 都是類似的強制退出. 最好使用執行緒函式的返回語句(return)來退出執行緒, 只有這樣才能安全的**該執行緒的處理器資源和記憶體資源. 而實際上 _endthreadex()函式和 _beginthreadex(...)函式一樣, 是封裝了windows函式 exitthread(), 如果一定要強制退出執行緒, 那麼強烈建議呼叫 _endthreadex() 函式, 這樣能安全的**系統資源.

具體的 _beginthreadex(...)函式 和 _endthreadex()函式在第6章中有很好的剖析. 同時還有兩個 _beginthread(...) 和 _endthread() 執行期庫函式, 也有講解.

windows還提供了一些庫函式用來獲得當前程序或者執行緒的控制代碼, 如 handle getcurrentprocess() 函式返回當前程序的控制代碼, handle getcurrentthread() 函式返回當前執行緒的控制代碼, 但是需要注意的是, 這些控制代碼都是 '偽控制代碼' , 即: 只在本程序和本執行緒內可用, 不可傳出取用.

如果需要在外部使用其它執行緒或程序的控制代碼, 則可以用 duplicatehandle(...) 函式獲得其它程序或者執行緒的 '實控制代碼' , 該函式接受7個引數, 具體的用法可以查閱一下msdn和網路. 需要注意的是, 在使用完 由duplicatehandle(...) 函式獲得的控制代碼後, 需要使用 closehandle() 函式來關閉該控制代碼.

C C 多執行緒

前幾天簡單對c和c 中的建立多執行緒的函式進行了測試,這篇隨筆就簡單介紹一下建立執行緒的相關函式。c中三個建立執行緒函式 pthread create beginthread createthread 三個關閉執行緒函式 pthread exit endthread exitthread 標頭檔案分...

C C 多執行緒筆記

例項 include include using namespace std define n 3 執行緒個數 void thread content void args intmain void r pthread join tids i r 阻塞當前執行緒,等待指定 上乙個 執行緒完成 retu...

多執行緒入門

跟前幾篇的風格一樣,我會在開篇的時候舉乙個現實生活中的例子,通過這個例子來對映一些晦澀枯燥的計算機程式設計專業知識,在讓讀者朋友很好地理解理論概念的同時,又避免了閱讀教科書時的枯燥感覺。這次我要舉的例子是公司。不一定是it公司,盡量和程式設計領域遠一點兒吧,那就假設是一家搬家公司吧。假如我們把公司看...