多執行緒API 第二講

2021-09-13 14:50:31 字數 3800 閱讀 8897

在windows下多執行緒api

標頭檔案 #include

createthread建立執行緒

handle createthread(

lpsecurity_attributes lptreadattributes,

dword dwstacksize,

lpthead_start_routine lpstartaddress,

lpviid lpparameter,

dword dwcreationflags,

lpdword lpthreadld

);

引數:

lptreadattributes:指向security_attributes型態的結構的指標。在windowsnt中設定為null使用預設安全性。

dwstacksize:設定初始棧的大小,以位元組為單位,如果為0,那麼預設將使用與呼叫該函式的執行緒相同的棧空間大小。

lpstartaddress:指向執行緒函式的指標,函式名稱沒有限制,但是必須以下列形式宣告:dword winapi threadproctor(lpvoid lpparam)

lpparameter:向執行緒函式傳遞的引數,是乙個void*的指標,不需要傳遞引數時,為null。

dwcreationflags:執行緒標誌,可取值如下

(1)create_suspended:建立乙個掛起的執行緒,它無法執行直到呼叫resumethread()。

(2)0:表示建立後立即啟用

(3)stack_size_param_is_a_reservation:未指定此標記,使用dwstacksize指定提交的大小。

lpthreadld:儲存新執行緒id,若不想返回執行緒id,設定值為null。

返回值:

成功返回執行緒控制代碼,失敗返回null,呼叫getlasterror()獲知失敗的原因。

createthread是windowsapi中在主線程的基礎上建立乙個新執行緒。建立成功後會返回乙個hthread的handle,且核心物件的計數加1,closehandle之後,引用計數減1,當變為0時,系統刪除核心物件。handle僅僅是執行緒的乙個標識。

closehandle 關閉執行緒控制代碼

bool closehandle(handle hobject);

只是關閉了乙個執行緒控制代碼,引用計數減1,表示我不對這個控制代碼對應的執行緒做任何干預(諸如waitforsingleobhect之類),但是並沒有結束執行緒。

成功返回true,失敗返回false,呼叫getlasterror()獲知失敗的原因。

suspendthread 掛起指定的執行緒

dword winapi suspendthread(handle hthread);

hthread:需要掛起的控制代碼。

resumethread 恢復被掛起的執行緒的執行。

dword winapi resumethread(handle hthread);

hthread:需要掛起的控制代碼。

sleep 休眠執行緒的執行

void winapi sleep(dword dwmilliseconds);

dwmilliseconds:公釐數

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

dword waitforsingleobject(

handle hobject,

dword dwmilliseconds

hobject:指明乙個核心物件的控制代碼

dwmilliseconds:等待時間

該函式需要傳遞乙個核心物件控制代碼,如果該核心物件處於未通知狀態,則該函式導致執行緒進入阻塞狀態;如果該核心物件處於已通知狀態,則該函式立即返回wait_object_0.第二個引數指明要等待的時間(毫秒)。infinite表示無限等待,如果第二個引數為0,那麼函式立即返回。如果等待超時,該函式返回wait_timeout。如果該函式失敗,返回wait_failed。

終止執行緒

終止執行緒執行的最佳方法是讓它的執行緒函式return返回。

除此之外,終止執行緒有兩個函式:

exitthread()  避免使用

terminatethread()必須避免

exitthread()

voidexitthread(dword dwexitcode);

可以讓執行緒呼叫exitthread函式,以便強制執行緒終止執行,如果使用這兩種方法退出執行緒,則不會執行執行緒函式的return語句,所以就不會呼叫執行緒函式作用域內申請的類物件的析構函式,會造成記憶體洩漏。

terminatethread()

bool terminatethread(

handle hthread,

dword dwexitcode

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

dwexitcode:退出碼。

返回值:

成功返回非零,失敗返回0,呼叫getlasterror()獲知原因。

terminatethread能夠撤銷任何執行緒,hthread引數用於標識被終止執行的執行緒的控制代碼。dwexitcode引數就是執行緒終止的退出碼。同時,·執行緒的核心物件的使用計數也被遞減。注意terminatethread函式是非同步執行的函式,當函式返回時,並不能保證執行緒被撤銷。如果需要確切地知道該執行緒已經終止執行,使用waitforsingleobject或者類似的函式,windows核心程式設計:乙個設計良好的應用程式絕不會使用這個函式,因為被終止執行的執行緒收不到它被「殺死」的通知,導致執行緒不能正確地清除。

getexitcodethread獲取執行緒結束碼

bool getexitcodethread(

handle hthread,

lpdword lpexitcode

hthread:由createthread()傳回的執行緒handle

lpexitcode:指向乙個dword,用於接收結束**(exit code)

返回值:成功返回true,失敗返回false,可以呼叫getlasterror()找出原因。如果執行緒已結束,那麼執行緒**會被放在lpexitcode引數中帶回來。如果執行緒尚未結束,lpexitcode帶回來的值是still_active。

在呼叫getexitcodethread()之前,要注意不要呼叫closehandle關閉掉執行緒控制代碼getexitcodethread()可以在呼叫waitforsingleobject()等待執行緒結束之後呼叫。

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

dword waitformultipleobjects(

dword dwcount,//等待的核心物件個數

dword handle* phobjects,//乙個存放被等待的核心物件的控制代碼的陣列

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

dword dwmilliseconds);//等待時間

該函式的第乙個引數指明等待的核心物件的個數,可以是0到maximum_wait_objects(64)中的乙個值。phobjects引數是乙個存放等待的核心物件控制代碼的陣列。bwaitall引數如果為true,則只有當等待的所有核心物件為已通知狀態時函式才返回,如果為false,則只要乙個核心物件為已通知狀態,則該函式返回,dwmilliseconds引數為等待的時間(毫秒)。

返回值:

該函式失敗,返回wait_failed;如果超時,返回wait_timeout;如果bwaitall引數為true,函式成功返回wait_object_0,如果bwaitall為false,函式成功則返回陣列的索引指明是哪個核心物件收到的通知。

第十三章 多執行緒 第二講

二 執行緒的生命週期 執行緒是乙個動態執行的過程,它也有乙個從產生到死亡的過程,這就是所謂的生命週期。生命週期的執行過程 新建 就緒 執行 死亡 1 生命週期的舉例與分析 1 新建 new thread 當建立thread類的乙個例項 物件 時,此執行緒進入新建狀態 未被啟動 例如 thread t...

linux 多執行緒API

執行於乙個程序中的多個執行緒,它們之間使用相同的位址空間,而且執行緒間彼此切換所需的時間遠遠小於程序間切換所需要的時間。據統計,乙個程序的開銷大約是乙個執行緒開銷的30倍左右。同一程序下的執行緒直接共享資料空間。int pthread create pthread t thread,const pt...

OO第二單元 多執行緒電梯

elevator request兩個執行緒。elevator執行緒主要負責乘客的接送和進出。request執行緒是接收乘客資訊。control是緩衝器,用來儲存elevator和request兩個執行緒共享的乘客佇列。以電梯當前樓層和執行狀態為基準,如果電梯是上行的,並且高於當前樓層還有乘客要進出就...