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