1.通知类型:
HANDLE CreateEventA(
[in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes,//安全描述符
[in] BOOL bManualReset,//填TRUE通知类型填FALSE互斥
[in] BOOL bInitialState,//填TRUE有信号填FALSE无信号,信号在互斥体中我们了解过。
[in, optional] LPCSTR lpName//随便起个名字
);
下面我们用代买来说明:
#include"stdafx.h"
#include<stdio.h>
#include<Windows.h>
HANDLE Event;
DWORD WINAPI ThreadProc_1(LPVOID lpParameter)
{
TCHAR szBuffer[10] = { 0 };
//当事件变成已通知时
WaitForSingleObject(Event, INFINITE);
//线程执行
printf("ThreadProc_1执行了\n");
getchar();
return 0;
}
DWORD WINAPI ThreadProc_2(LPVOID lpParameter)
{
TCHAR szBuffer[10] = { 0 };
//当事件变成已通知时
WaitForSingleObject(Event, INFINITE);
//线程执行
printf("ThreadProc_2执行了\n");
getchar();
return 0;
}
int main(int argc, char* argv[])
{
//创建事件
//四个参数:1.默认安全属性 2.TRUE通知/FALSE互斥 3.初始没信号 4.没有名字
Event = CreateEventA(NULL, TRUE, FALSE, NULL);
HANDLE hThread[2];
//创建连个线程
hThread[0] = CreateThread(NULL, 0, ThreadProc_1, NULL, 0, NULL);
hThread[1] = CreateThread(NULL, 0, ThreadProc_2, NULL, 0, NULL);
//设置事件为已通知(下面这句)
/*SetEvent(Event);*/ //注意*****我们第一次先把这句屏蔽来看一下输出
WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(Event);
getchar();
return 0;
}
输出:
发现什么都不输出。这是因为我们把第三个参数写成了FALSE,就是说创建的Event是没有信号的。
接下来我们把上面那句代码加上
输出:
发现输出了,这时因为SetEvent(Event)把Event设置为了有信号的。
这里就有问题了。按照我们之前学习的互斥体中所讲的,两个线程中有任意一个WaitForSingleObject()了那么另一个应该没法执行(我们没有返回“令牌”的代码)这就是因为我们设置为了通知类型,所以两个线程都能执行。具体的原理下面再解释我们先把第二个参数改为FALSE