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); 使事件变为已通知状态又立即变为未通知状态
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); 使事件变为已通知状态又立即变为未通知状态
相关文章推荐
- Windows中多线程同步之事件(Event)
- windows 多线程同步技术
- windows 多线程同步技术
- windows多线程同步之事件对象
- windows多线程同步参考
- Windows下C++多线程同步与互斥简单运用
- windows下多线程同步及互斥代码,并且加入了守卫(自动锁)
- windows多线程同步互斥--总结
- 【转】windows平台多线程同步之Mutex的应用
- Windows多线程同步系列之二-----关键区
- Windows多线程同步系列之三-----事件对象
- windows平台多线程同步之Mutex的应用
- windows多线程同步
- windows多线程同步互斥--总结
- 总结windows多线程同步互斥
- windows多线程同步
- Windows多线程同步系列之二-----关键区
- Windows下C++多线程同步与互斥简单运用
- 多线程同步与通信 Windows
- Windows下C++多线程同步