1. 程式人生 > >Win32多執行緒之等待一個執行緒的結束(WaitForSingleObject)

Win32多執行緒之等待一個執行緒的結束(WaitForSingleObject)

  由於執行緒停工是作業系統的責任,當然作業系統也有責任讓其他執行緒知道某個執行緒停工了。

   Win32提供了一個名為WaitForSingleObject()的函式。他的第一個引數是個核心物件(如執行緒)的handle,為了方便討論,我把即將等待的執行緒稱為執行緒#1,把正在執行的執行緒稱為執行緒#2。剛剛說的“執行緒核心物件”指的是執行緒#2。

  呼叫WaitForSingleObject()並放置一個“執行緒核心物件”作為引數,將使執行緒#1開始睡眠,直到執行緒#2結束為止。

就像Sleep()函式一樣,WaitForSingleObject()也有一個引數用來指定最長的等待時間。

DWORD WINAPI WaitForSingleObject(  HANDLE hHandle,  DWORD dwMilliseconds ); 引數 hHandle :  等待物件的handle(代表一個核心物件),在本例中,此為執行緒handle。 dwMilliseconds :  等待的最長時間,時間終了,即使handle尚未成為激發狀態,此函式還是要返回。 此值可以是0(代表立即返回),也可以是INFINITE(代表無窮等待)。 返回值       如果函式失敗,則傳回WAIT_FAILED.這時候你可呼叫GetLastError()取得更多資訊。 此函式的成功有三個因素: 1.等待的目標(核心物件)變成激發狀態。這種情況下返回值將為WAIT_OBJECT_0。 2.核心物件變成激發狀態之前,等待時間結束,這種情況下返回值將為WAIT_TIMEOUT。
3.如果一個擁有mutex(互斥器)的執行緒結束前沒有釋放mutex,則傳回WAIT_ABANDONED。    獲得一個執行緒物件的handle之後,WaitForSingleObject()要求作業系統讓執行緒#1睡覺,直到以下任何一種情況發生:   情況1)執行緒#2結束;   情況2)dwMilliseconds 時間結束(該值從函式呼叫後開始計算)。    由於作業系統持續追蹤執行緒#2,即使執行緒#2失事或被強迫結束,WaitForSingleObject()仍然能夠正常運作。 關於time-out,有一個特別重要 的用途,但很少人注意。設定time-out為0,使你能夠檢查handle的狀態並立刻返回,沒有片刻停留。如果handle已經準備好,這個函式會成功並傳回WAIT_OBJECT_0。否則,這個函式立刻返回並傳回WAIT_TIMEOUT。
   另有其他一些理由使你需要設定time-out引數。最簡單的理由是你不想被粘住,特別是你在除錯的時候。如果你等待的執行緒陷入死迴圈,你或許可以根據此函式的返回值以及time-out獲得一些警告。   WaitForSingleObject()可以面對許多中handles工作。不一定非得是執行緒handle。事實上,Win32大部分以HANDLE表示的物件都可以作為WaitForSingleObject的等待目標。 視你所擁有的物件而不同,作業系統等待的事情也不一樣。形式上來講,系統等待這一物件“被激發”。