等待乙個核心物件變為已通知狀態(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...