在多執行緒的情況下,有時候我們會希望等待某一線程完成了再繼續做其他事情,要實現這個目的,可以使用windows api函式waitforsingleobject,或者waitformultipleobjects。這兩個函式都會等待object被標為有訊號(signaled)時才返回的。
那麼,訊號是什麼呢?首先我們可以假設這裡存在乙個檔案和兩個執行緒,我們規定這個檔案同一時刻只能被乙個執行緒所訪問開啟,那麼我們的執行緒該如何知道這個檔案現在有沒有被別的執行緒訪問呢?我們可以讓執行緒等在乙個死迴圈裡,這個迴圈之一在嘗試開啟訪問這個檔案,直到能夠開啟為止;這樣做雖然可以實現目的,但是死迴圈會占用大量的記憶體,所以windows就設定了訊號量。訊號量的作用簡單理解就是乙個標誌位,在我們上述的問題中,這個檔案就有乙個訊號量,初始時我們設訊號量為false,而只有當訊號量為false時執行緒才可以開啟訪問這個檔案。那麼,當第乙個執行緒到達,訊號量為false,執行緒開啟檔案進行訪問,並將訊號量置為true;在第乙個執行緒在訪問檔案時,第二個執行緒到來,此時訊號量仍未true,所以第二個執行緒等待,這個等待的過程就是waitforsingleobject。waitforsingleobject在等待的過程中會進入乙個非常高效的沉睡等待狀態,只占用極少的cpu時間片。
waitforsingleobject()
1. 格式
dword waitforsingleobject( handle hhandle, dworddwmilliseconds);
有兩個引數,分別是thandle和timeout(毫秒單位)。
如果想要等待一條執行緒,那麼你需要指定執行緒的handle,以及相應的timeout時間。當然,如果你想無限等待下去,timeout引數可以指定系統常量infinite。
2. 使用物件
它可以等待如下幾種型別的物件:
event,mutex,semaphore,process,thread
3. 返回型別
有三種返回型別:
wait_object_0, 表示等待的物件有訊號(對執行緒來說,表示執行結束);
wait_timeout, 表示等待指定時間內,物件一直沒有訊號(執行緒沒執行完);
wait_abandoned 表示物件有訊號,但還是不能執行 一般是因為未獲取到鎖或其他原因
**例如下:
//結果為://#include
"stdafx.h
"#include
"stdio.h
"#include
"windows.h
"#include
using
namespace
std;
int i = 0
;dword winapi funproc(lpvoid lpparameter);
dword winapi funproc(lpvoid lpparameter)
return0;
}void
main()
if (dwret ==wait_timeout)
if (dwret ==wait_abandoned)
closehandle(hthread);
system(
"pause");
return0;
}
這段**中,首先在開始定義乙個變數 i 為 0 ,然後在主函式中先將其輸出便有了結果中第一行的 0 。
之後我們開啟執行緒,進入執行緒函式funproc,在funproc中將 i++ 對 10 取餘輸出,一直到 i > 10 結束迴圈,執行緒結束,這時返回給waitforsingleobject的結果為wait_object_0,表示執行緒正常結束,並將結果輸出。
這其中waitforsingleobject的效果就相當於乙個關卡,只有返回給了waitforsingleobject結果程式才能繼續執行。
這就是未能等到執行緒結束訊號量的等待時間就耗光了。我們也可以將waitforsingleobject的第二個引數設定為infinite,就可以一直等待。結果為:
參考原文:waitforsingleobject
WaitForSingleObject的通俗講解!
用最簡單的語言說就是這個物件有兩個狀態比如我們稱0和1,稱什麼一點也不重要,有訊號和無訊號就是相對的兩個狀態,沒什麼意義,你就認為乙個狀態是0另乙個狀態是1。在程式裡如果加了waitforsingleobject,那麼程式到這裡就去檢測你給他的那個控制代碼的狀態,如果是0程式就停在這裡了,如果是1,...
WaitForSingleObject的詳細用法
在多執行緒的情況下,有時候我們會希望等待某一線程完成了再繼續做其他事情,要實現這個目的,可以使用windows api函式waitforsingleobject,或者waitformultipleobjects。這兩個函式都會等待object被標為有訊號 signaled 時才返回的。那麼,訊號是什...
WaitForSingleObject的詳細用法
使用者模式的執行緒同步機制效率高,如果需要考慮執行緒同步問題,應該首先考慮使用者模式的執行緒同步方法。但是,使用者模式的執行緒同步有限制,對於多個程序之間的執行緒同步,使用者模式的執行緒同步方法無能為力。這時,只能考慮使用核心模式。windows提供了許多核心物件來實現執行緒的同步。對於執行緒同步而...