您的位置:首页 > 移动开发 > Objective-C

windows 下多线程同步

2008-10-18 13:16 169 查看
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); 使事件变为已通知状态又立即变为未通知状态
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息