CreateEvent该函数的作用和用法
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 事件属性,一般为NULL
BOOL bManualReset, // 是否自动设置为有信号:是TRUE,否FALSE
BOOL bInitialState, // 初始化状态:有信号TRUE,无信号FALSE
LPCTSTR lpName // 信号量别名 ,可置为NULL
);
注:
手动和自动重置为有信号解释:TRUE,当线程结束后会自动设置事件为有信号,FALSE,当线程结束后需要手动设置有信号
创建一个事件,该事件有两个信号:有信号和无信号;
在不同的线程中,使用等待一个事件是否有信号和无信号,来达到多个不同的线程之间的同步,达到对某一数据同一时间内只能有一个线程访问;
例如:
#include "stdafx.h"
#include <Windows.h>
DWORD WINAPI ThreadProc1(LPVOID lparam);
DWORD WINAPI ThreadProc2(LPVOID lparam);
HANDLE hEvent = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
int nCount = 0;
//hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);//手动设置有信号,初始为有信号
hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);//自动设置有信号,初始为有信号
HANDLE hThread1 = NULL;
hThread1 = CreateThread(NULL,0,ThreadProc1,&nCount,0,NULL);
if (NULL == hThread1)
{
printf("Create ThreadProc1 failed\n");
}
CloseHandle(hThread1);
Sleep(500);
HANDLE hThread2 = NULL;
hThread2 = CreateThread(NULL,0,ThreadProc2,&nCount,0,NULL);
if (NULL == hThread2)
{
printf("Create ThreadProc2 failed\n");
}
CloseHandle(hThread2);
getchar();
return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lparam)
{
int *p = (int*)lparam;
// while (1)
// {
DWORD nReturn = WaitForSingleObject(hEvent,INFINITE);
if (WAIT_OBJECT_0 == nReturn)
{
printf("ThreadProc1:%d\n",++(*p));
//SetEvent(hEvent);//自动设置有信号时,需要使用它设置事件为有信号
}
// }
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lparam)
{
int *p = (int*)lparam;
// while (1)
// {
DWORD nReturn = WaitForSingleObject(hEvent,INFINITE);
if (WAIT_OBJECT_0 == nReturn)
{
printf("ThreadProc2:%d\n",++(*p));
//SetEvent(hEvent);//自动设置有信号时,需要使用它设置事件为有信号
}
// }
return 0;
}
参考自:http://blog.youkuaiyun.com/richerg85/article/details/7471426