windows 下多線程同步

DOWRD WaitForSingleObject(
          HANDLE   hObject,   //標識一個能夠被支持被通知/未通知的內核對象
          DOWRD    dwMilliseconds); // 爲了等待該對象變爲已通知狀態,它將等待多長時間
如果線程等待的對象變爲已通知狀態,那麼返回值是WAIT_OBJECT_0,超時返回WAIT_TIMEOUT,如果將一錯誤的值傳給
WaitForSingleObject那麼將返回WAIT_FAILED(可用GETLastError瞭解詳細信息)

DWORD WaitForMultipleObjects(
          DWORD     dwCount, //函數查看內核對象的數量,值在1~ MAXIMUM_WAIT_OBJECTS之間,windows爲 64
          CONST      HANDLE *  phObjects,  //指向內核對象的數組的指針
          BOOL        fWaitAll, //爲TRUE時要等待所有對象狀態變爲已通知,否則只等待一個狀態變爲已通知,線程便可以執行
          DWORD     dwMilliseconds); //與WaitForSingleObject中的一樣

HANDLE CreateEvent(
          PSECURITY_ATTRIBUTES  psa,
          BOOL   fManualReset, //TRUE -  人工重置的事件,FALSE - 自動重置的事件
          BOOL   fInitialState, // 初始化已通知狀態(TRUE)還是未通知狀態(FALSE)
          PCTSTR  pszName);

HANDLE  OpenEvent(
          DWORD   dwAcess,
          BOOL   fInherit,
          PCTSTR   pszName);
與所有事件內核對象一樣,不再需要時調用CloseHandle函數

BOOL  SetEvent(HANDLE  hEvent); //將事件改爲已通知狀態

BOOL  ResetEvent(HANDLE  hEvent); // 將事件改爲未通知狀態

EXAMPLE:

HANDLE g_hEvnet;

int WINAPI WinMain(...) {
   g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

   HANDLE hThread[3];
   DWORD  dwThreadId;
   hThread[0]  =  _beginthreadex(NULL, 0, WordCount, NULL, 0, &dwThreadId);
  
hThread[1]  =  _beginthreadex(NULL, 0, SpellCheck, NULL, 0, &dwThreadId);
   hThread[2]  =  _beginthreadex(NULL, 0, GrammarCheck, NULL, 0, &dwThreadId);

   OpenFileAndReadContentIntoMemory(...);

   SetEvent(h_gEvent);
   ...
}

DWROD WINAPI WordCount(PVOID pvParam) {
    WaitForSingleObject(g_hEvent, INFINITE);
    ...
    SetEvent(g_hEvent);
    return  0;
}

DWROD WINAPI SpellCheck(PVOID pvParam) {
    WaitForSingleObject(g_hEvent, INFINITE);
    ...
    SetEvent(g_hEvent);
    return  0;
}

DWROD WINAPI GrammarCheck(PVOID pvParam) {
    WaitForSingleObject(g_hEvent, INFINITE);
    ...
    SetEvent(g_hEvent);
    return  0;
}


補充一個函數BOOL PulseEvent(HANDLE hEvent); 使事件變爲已通知狀態又立即變爲未通知狀態






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