WaitForSingleObject和WaitForMultipleObjects

在多線程的情況下,有時候我們會希望等待某一線程完成了再繼續做其他事情,要實現這個目的,可以使用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 表示對象有信號,但還是不能執行  一般是因爲未獲取到鎖或其他原因

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章