WINAPI 多執行緒二

2021-08-22 13:32:31 字數 3360 閱讀 6131

等待乙個核心物件變為已通知狀態(single 單個)

dword waitforsingleobject(handle hobject,dword dwmilliseconds);

hobject:               指明乙個核心物件的控制代碼(執行緒控制代碼)

dwmilliseconds:等待時間 毫秒數

備註:1.函式需要傳遞乙個核心(或執行緒)物件控制代碼。

2.如果該核心物件處於未通知狀態,則該函式導致執行緒進入阻塞狀態。(執行緒未結束)

3.如果該核心物件處於已通知狀態,則該函式立即返回wait_object_0。(執行緒已結束)

4.第二個引數指明要等待的時間(毫秒),infinite表示無限等待。

5.如果第二個引數為0,那麼函式立即返回。

6.如果等待超時,該函式返回wait_timeout。

7.如果失敗, 返回wait_failed。

終止執行緒

最佳方式:     讓它的執行緒函式return返回。

避免使用:     exitthread();

必須避免:     terminatethread();

exitthread():(執行緒內部)

void exitthread(dword dwexitcode);            dwexitcode: 退出碼

可以讓執行緒呼叫exitthread函式,以便強制執行緒終止執行。

使用這個函式退出執行緒,不會執行執行緒函式的return語句。

不呼叫return,就不會呼叫執行緒函式作用域內申請的類物件的析構函式,會造成記憶體洩漏。

terminatethread():(執行緒外)

bool terminatethread(handle hthread, dword dwexitcode);

hthread:       被終止的執行緒控制代碼

dwexitcode: 退出碼

備註:2.成功:返回非0。

3,失敗:返回0,可呼叫getlasterror()獲取原因。

注:1.terminatethread能夠撤銷任何執行緒。

2.執行緒的核心物件的使用記數也被遞減。

3.該函式是非同步執行的函式,當函式返回時,並不能保證執行緒被撤銷。

4.需要確切的直到該執行緒已經終止執行,可使用waitforsingleobject或類似函式。

5.windows核心程式設計:乙個設計良好的應用程式決不會使用這個函式, 因為被終止執行的執行緒收不到它被「殺死」的通知,導致執行緒不能正確的清除。

獲取執行緒結束碼

bool getexitcodethread(handle hthread, lpdword lpexitcode);

hthread:     由createthread()傳回的執行緒handle控制代碼

lpexitcode: 指向乙個dword,用於接收結束**

備註:1.成功:返回true。

2.失敗:返回false,可以呼叫getlasterror()找出原因。

3.如果執行緒已結束,那麼執行緒的結束**會被放在lpexitcode引數中帶回來。

4.如果執行緒尚未結束,lpexitcode帶回來的值是still_active.

5.在呼叫該函式之前,注意不要呼叫closehandle關閉掉執行緒控制代碼。

6.該函式可以在呼叫waitforsingleobject()等待執行緒結束之後再呼叫。(執行緒不會阻塞)

等待多個核心物件變為已通知狀態

dword  waitformultipleobjects(

dword dwcount, 

const handle* phobjects,

bool bwaitall,

dword dwmilliseconds);

dwcount:               等待的核心物件個數

phobjects:           乙個存放被等待的核心物件控制代碼的陣列

bwaitall:             是否等到所有核心物件為已通知狀態後才返回

dwmilliseconds:  等待時間(毫秒)

備註:1.該函式的第乙個引數指明等待的核心物件的個數,可以是0到maximum_wait_objects(64)中的乙個值。

2.bwaitall如果為true, 則只有當等待所有核心物件為已通知狀態時函式才返回。

3.bwaitall如果為false,則只要乙個核心物件為已知狀態,則該函式返回該函式在其陣列物件中的位置。

返回值:

失敗:返回wait_failed

超時:返回wait_timeout

bwaitall引數為true 函式成功:返回wait_object_0

bwaitall引數為false函式成功:返回陣列的索引指明是哪個核心物件收到通知。

#include #include using namespace std;

dword winapi threadfun(lpvoid lpthreadparameter);

int main()

//等待主線程執行3s

dword result = waitforsingleobject(thread, 3000);

if (result == wait_timeout)

//無限等待,除非子執行緒執行結束(阻塞)

waitforsingleobject(thread, infinite);

//獲取退出碼

getexitcodethread(thread, &code);

cout << "子執行緒的退出碼為:" << code << endl;

cout << "主線程結尾" << endl;

return 0;

}dword winapi threadfun(lpvoid lpthreadparameter)

; //true 為等待至所有執行緒退出 false 為其中乙個退出

dword ret = waitformultipleobjects(3, handlearry,false, infinite);

if (ret == 0)

else

cout << "主線程退出!" << endl;

return 0;

}dword winapi threadfun(lpvoid name)

else if (strcmp(pname, "b") == 0)

else

cout << pname << "執行緒退出!" << endl;

return 0;

}

注:均為自己學習時所做記錄 方便日後查閱

多執行緒系列(二) 多執行緒基礎

目錄 一 執行緒的幾種狀態 屬性 方法 執行緒的5個狀態 1 建立狀態 new 對應 thread th new thread worker 時 就建立了乙個新的執行緒,僅僅是新建狀態,程式還沒有執行執行緒中的 2 就緒狀態 runnable 對應 th.start 方法,新建執行緒在接收到star...

執行緒二 多執行緒基礎

任務量比較大,通過多執行緒可以提高效率時,需要非同步處理時,占用系統資源,造成阻塞的工作時,都可以採用多執行緒提高效率 執行緒建立 使用者執行緒和守護執行緒 j a分為兩種執行緒 使用者執行緒和守護執行緒 守護執行緒 在程式執行的時候在後台提供一種通用服務的執行緒,比如垃圾 執行緒就是乙個很稱職的守...

多執行緒二 多執行緒安全問題

當多個執行緒共享同乙個全域性或者靜態變數,做寫的操作,可能會發生資料衝突問題,也就是執行緒安全問題。讀操作和區域性變數是不會發生的。二 執行緒安全的解決方法 該資源只能讓當前執行緒操作,操作完成之後,再讓其他執行緒執行 多執行緒之間同步 synchronized 使用鎖 lock 語法 synchr...