SetEvent/ResetEvent
2015-08-24 16:25
567 查看
在自动重置事件对象中,当WaitSingleObject/WaitForMultipleObjects接收到SetEvent发送过来的信号后则返回WAIT_OBJECT_0,此时操作系统(待定)自动重置等待的事件对象(即自动将其设置为无信号状态。无论何时通过SetEvent发送过来的信号,只要未被接收到均不会被自动重置。但在未被接收之前可以调用ResetEvent手动重置等待的事件对象,此时等待的事件对象为无信号状态)。
在手动重置事件对象中,当WaitSingleObject/WaitForMultipleObjects接收到SetEvent发送过来的信号后则返回WAIT_OBJECT_0,此时需要调用ResetEvent手动重置等待的事件对象(即手动将其设置为无信号状态)。
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
DWORD g_dwThreadID;
DWORD g_dwThreadID2;
UINT g_nTickets = 300;
HANDLE g_hEvent = NULL;
int main(int argc, char* argv[])
{
cout << "Main thread is running." << endl;
HANDLE hHandle = CreateThread(NULL, 0, ThreadProc, NULL, 0, &g_dwThreadID);
HANDLE hHandle2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, &g_dwThreadID2);
CloseHandle(hHandle);
CloseHandle(hHandle2);
g_hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
Sleep(4000);
system("pause");
return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
// cout << "No." << g_dwThreadID << " thread is running." << endl;
while (TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE);
if (g_nTickets > 0)
{
Sleep(1);
cout << "No.1-" << g_dwThreadID << " sell ticket : " << g_nTickets << endl;
g_nTickets--;
SetEvent(g_hEvent);
}
else
{
break;
}
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
// cout << "No." << g_dwThreadID2 << " thread is running." << endl;
while (TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE);
if (g_nTickets > 0)
{
Sleep(1);
cout << "No.2-" << g_dwThreadID2 << " sell ticket : " << g_nTickets << endl;
g_nTickets--;
SetEvent(g_hEvent);
}
else
{
break;
}
}
return 0;
}
在手动重置事件对象中,当WaitSingleObject/WaitForMultipleObjects接收到SetEvent发送过来的信号后则返回WAIT_OBJECT_0,此时需要调用ResetEvent手动重置等待的事件对象(即手动将其设置为无信号状态)。
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
DWORD g_dwThreadID;
DWORD g_dwThreadID2;
UINT g_nTickets = 300;
HANDLE g_hEvent = NULL;
int main(int argc, char* argv[])
{
cout << "Main thread is running." << endl;
HANDLE hHandle = CreateThread(NULL, 0, ThreadProc, NULL, 0, &g_dwThreadID);
HANDLE hHandle2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, &g_dwThreadID2);
CloseHandle(hHandle);
CloseHandle(hHandle2);
g_hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
Sleep(4000);
system("pause");
return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
// cout << "No." << g_dwThreadID << " thread is running." << endl;
while (TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE);
if (g_nTickets > 0)
{
Sleep(1);
cout << "No.1-" << g_dwThreadID << " sell ticket : " << g_nTickets << endl;
g_nTickets--;
SetEvent(g_hEvent);
}
else
{
break;
}
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
// cout << "No." << g_dwThreadID2 << " thread is running." << endl;
while (TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE);
if (g_nTickets > 0)
{
Sleep(1);
cout << "No.2-" << g_dwThreadID2 << " sell ticket : " << g_nTickets << endl;
g_nTickets--;
SetEvent(g_hEvent);
}
else
{
break;
}
}
return 0;
}
相关文章推荐
- 获取视频帧图片
- 剑指offer面试题20-顺时针打印矩阵
- Cocos2d-X 使用CCTableView创建滚动视图
- DELL 服务器报CPU 1 has an internal error (IERR)
- 获取视频帧图片
- AIX配置时间服务器(NTP)
- js日期格式化
- android 学习笔记 发送有序的广播
- Spring MVC实现跳转的几种方式
- Web攻防系列教程之跨站脚本攻击和防范技巧详解
- kvm安装centos报错error processing drive
- iOS自动化常用命令集合
- Android的NDK开发(3)————JNI数据类型的详解
- Leetcode #7 Reverse Integer
- ActiveAndroid 初学
- UITabbarViewController+Navigation框架下的子视图的跳转示例之一
- xcode提示: failed to get the task for process 解决方法
- getRotationMatrix2D函数
- 输入3个整数,按由小到大的顺序输出(使用指针)
- hibernate关联关系注解配置