執行緒等待 WaitFor

2021-05-02 19:11:32 字數 2187 閱讀 3134

一:bool getexitcodethread(handle hthread, lpdword lpexitcode);

該函式可以決定乙個執行緒是否還在執行,只要不斷的檢測返回值就可以判斷執行緒是否結束。但是不斷的檢測會浪費cpu事件。常說的busy loop就是這種現象。

二:dword waitforsingleobject(handle hhandle, dword dwmilliseconds);

hhandle:等待物件的控制代碼(代表乙個核心物件),如執行緒控制代碼。

dwmilliseconds:時間間隔,即使物件未啟用,時間到了還是會返回

1:此函式返回成功的三個因素:

1)等待的目標(核心物件)變成激發狀態,返回wait_object_0;

2)核心物件變成激發狀態前,等待時間到了,返回wait_timeout;

3)如果乙個擁有mutex(互斥器)的執行緒結束前沒有釋放mutex,則傳回wait_abandoned。

當執行緒正在執行時,執行緒物件處於未啟用狀態。當執行緒結束時,執行緒物件就會被啟用,函式waitforsingleobject就會醒來。需要注意的是:醒來未必立即被調動,而只是從休眠態佇列排入就緒佇列,等待作業系統排程。

handle g_hevent;

uint _stdcall childfunc(lpvoid);

int main(int argc, char* argv)

uint _stdcall childfunc(lpvoid)

2:那麼哪些物件物件是被激發的物件。

對於執行緒/程序,如果還在執行,該物件就處於未激發;如果執行結束,則轉入激發狀態。

對於檔案物件,如果乙個i/o操作完成,該檔案物件即處於激發狀態;

對於事件,createevent()初態為true,或setevent()、pulseevent(),事件為激發態;

對於互斥器,如果未被任何程序鎖定,該物件處於激發狀態;

對於訊號量,如果訊號量的現值大於0,該物件處於激發狀態;

對於控制台輸入,當console視窗的輸入緩衝區中有資料可用時,此物件被激發。

三:dword waitformultipleobjects(dword ncount, const handle *lphandles, bool fwaitall,dword dwmilliseconds );

ncount 控制代碼的數量 最大值為maximum_wait_objects(64)

handle 控制代碼陣列的指標。不需要為相同型別

handle 型別可以為(event,mutex,process,thread,semaphore )陣列

bool bwaitall 等待的型別,如果為true 則等待所有訊號量有效在往下執行,false 當有其中乙個訊號量有效時就向下執行

dword dwmilliseconds 超時時間 超時後向執行。 如果為wsa_infinite 永不超時。如果沒有訊號量就會在這死等。

1:返回值

1)等待時間到了,返回wait_timeout;

2)當bwaitall是true的時候正常返回值是 wait_object_0;

3)當bwaitall是false的時候,返回值減去wait_object_0,就是表示陣列中哪乙個handle被啟用了。

4)如果等待物件中有mutex,則傳回值範圍從wait_abandoned_0到wait_abandoned_0 + ncount – 1。

dword winapi threadfunc(lpvoid);

#define thread_pool_size 3

#define max_thread_index thread_pool_size-1

#define num_tasks 6

int main()

//建立執行緒,賦值給剛剛被啟用的執行緒陣列

hthrds[slot] = createthread(null,0,threadfunc,(lpvoid)slot,0,&threadid )

slot++;

}//等待所有執行緒都結束後,推出

rc = waitformultipleobjects(thread_pool_size,hthrds,true,infinite );

for (slot=0; slot= wait_object_0 && dret < wait_object_0+ nwaitcount)

else

}else

}

等待執行緒結束

今天在除錯乙個多執行緒的程式時一直出問題,具體情況是這樣的 我在程式的開始執行乙個執行緒,執行緒一直執行,知道程式結束時才結束,所以我的程式在結束時要等待執行緒結束再結束自己。正在裝載資料 我後來發現了問題,修改後就ok了,我把修改後的大致 帖出 uint ispress lpvoid lppara...

JAVA 執行緒等待

應用 public class main catch interruptedexception e system.out.println 結束,老闆開始檢查了!system.out.println 一共搬了 cm.get z 塊磚,大家辛苦了。executor.shutdown 物件 public ...

執行緒等待與喚醒

標籤 多執行緒 所有的等待和喚醒執行緒,都是針對某個具體物件例項的.api介面 說明wait 讓當前執行緒進入等待 阻塞 狀態,直到其他執行緒呼叫此物件的notify 或notifyall 來喚醒,之後該執行緒進入就緒狀態.wait long timeout 讓當前執行緒進入阻塞狀態,直到其他執行緒...