1. 程式人生 > >WIN32多執行緒二 用WaitXXX函式等待執行緒結束

WIN32多執行緒二 用WaitXXX函式等待執行緒結束

 等待執行緒結束的更好方法是呼叫API WaitForSigleObject和WaitForMultipleObjects。前者用於等待一個執行緒由未激發狀態變為激發狀態,後者用於等待多個執行緒中全部或多箇中的一個由未激發狀態變為激發狀態。對執行緒核心物件而言,如果執行緒在執行,則是未激發狀態;如果執行緒已經退出,則是激發狀態。不同核心物件的激發、未激發狀態含義有所不同。

DWORD WINAPI WaitForSingleObject(
  __in          HANDLE hHandle,        //等待的核心物件控制代碼
  __in          DWORD dwMilliseconds    //等待的超時時間
);
函式失敗,返回WAIT_FAILED;
等待物件變為激發狀態,返回WAIT_OBJECT_O;
等待超時,返回WAIT_TIMEOUT;
一個擁有mutex的執行緒結束前,沒有釋放掉mutex,則返回WAIT_ABANDONED.

DWORD WINAPI WaitForMultipleObjects(
  __in          DWORD nCount,        //等待核心物件個數
  __in          const HANDLE* lpHandles,//核心物件陣列
  __in          BOOL bWaitAll,        //是否等待所有核心物件,還是等待其中一個變為激發狀態就返回
  __in          DWORD dwMilliseconds    //等待的超時時間
);
函式失敗,返回WAIT_FAILED;
等待超時,返回WAIT_TIMEOUT;
bWaitAll為TRUE,所有物件變為激發狀態,返回WAIT_OBJECT_O;
bWaitAll為FALSE,返回值減去WAIT_OBJECT_O的值就是變為激發狀態核心物件在陣列中的索引;
如果核心物件中有mutex,返回值可能在WAIT_ABANDONED到WAIT_ABANDONED+nCount-1。

下面是個<<WIN32多執行緒程式設計>>中用WaitForMultipleObjects實現的簡單的執行緒池的例子,3個執行緒來完成6個任務。