Windows线程(六)使用事件机制解决线程同步问题
2018-02-19 14:51
393 查看
事件相关函数:
使用事件机制解决线程同步问题测试代码:
以上代码在Visual Studio 2010中的运行结果如下:
由此可见,使用事件机制和关键段,终于解决了线程同步与互斥的问题。
1.创建事件:CreateEvent HANDLE CreateEvent ( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName ); 2.根据时间名称获得事件句柄:OpenEvent HANDLE OpenEvent ( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName ); 3.触发事件:SetEvent BOOL SetEvent(HANDLE hEvent); 4.将事件设置为未触发:ResetEvent BOOL ResetEvent(HANDLE hEvent); 5.将被触发后的事件立即设置为未触发:PulseEvent BOOL PulseEvent(HANDLE hEvent);
使用事件机制解决线程同步问题测试代码:
#include <stdio.h> #include <process.h> #include <Windows.h> #define THREAD_NUM 10 unsigned long g_nNum; //事件与关键段 HANDLE g_hThreadEvent; CRITICAL_SECTION g_csThreadCode; unsigned int __stdcall ThreadFun(void *pM) { int nThreadNum = *(int *)pM; //触发事件 SetEvent(g_hThreadEvent); Sleep(50); EnterCriticalSection(&g_csThreadCode); g_nNum++; Sleep(0); printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum); LeaveCriticalSection(&g_csThreadCode); return 0; } int main() { int i = 0; HANDLE handle[THREAD_NUM]; printf("--------------------经典线程同步之事件--------------------\n"); //初始化事件和关键段, 自动置位,初始化无触发的匿名事件 g_hThreadEvent = CreateEvent(NULL, 0, 0, NULL); InitializeCriticalSection(&g_csThreadCode); g_nNum = 0; while(i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, &i, 0, NULL); //等待事件被触发 WaitForSingleObject(g_hThreadEvent, INFINITE); i++; } WaitForMultipleObjects(THREAD_NUM, handle, 1, INFINITE); //销毁事件和关键段 CloseHandle(g_hThreadEvent); DeleteCriticalSection(&g_csThreadCode); system("pause"); return 0; }
以上代码在Visual Studio 2010中的运行结果如下:
由此可见,使用事件机制和关键段,终于解决了线程同步与互斥的问题。
相关文章推荐
- Windows线程(七)使用互斥量无法解决线程同步问题
- Windows线程(五)关键段无法解决线程同步问题
- Windows 服务中使用 Timer 控件时,Tick 事件不命中问题的解决
- Windows 服务中使用 Timer 控件时,Tick 事件不命中问题的解决
- 飞信2008在Windows 7不能使用问题的解决方法
- mobile中使用vScrollBar解决DataGrid无滚动事件问题
- 使用Jquery的鲜活绑定(lively-ness),解决“新添加的元素,事件不可用”的问题
- 解决Vista中使用VPC2007运行Vista,Windows 2003时无法连上internet问题
- 用Windows消息机制解决跨线程添加子控件异常
- 解决在Windows和Windows Server的应用程序日志中记录了”事件ID 4107”或”事件ID 11”错误问题
- 解决使用工具栏组件时控件焦点事件的问题
- 如何在 Windows 恢复环境中使用 Bootrec.exe 工具解决和修复 Windows Vista 中的启动问题
- 在windows下使用putty连接虚拟中的linux出现主机拒绝的问题(已解决)
- 解决在Windows和Windows Server的应用程序日志中记录了”事件ID 4107”或”事件ID 11”错误问题
- 线程安全问题(解决) -------使用spring 的action-servlet.xml解决struts线程问题
- OP:windows 2008 安装之后无线网无法使用问题解决(Windows 2008 Wireless)
- 如何在 Windows 恢复环境中使用 Bootrec.exe 工具解决和修复 Windows Vista 中的启动问题
- 使用cygwin在windows上模拟unix环境,解决不能显示中文的问题
- windows 2008初体验常见问题: 无线网络"没有正确配置为使用IP协议" 错误解决办法
- Windows 2003 SP2使用QQ死机问题解决办法