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); 使事件變爲已通知狀態又立即變爲未通知狀態
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); 使事件變爲已通知狀態又立即變爲未通知狀態
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.