事件可以实现线程之间的同步,如线程A创建事件,线程B等候该事件,,事件的等候遵循谁先等候,谁先获取执行权,事件初始状态可以设置为有信号的,当线程B等到该信号,立马可以获取到执行权,执行完自己要执行的代码块之后,重置事件为无信号状态,此时线程A中又将该事件设置为有信号状态,线程B发现该事件有信号,又开始执行,这样可以达到一个线程控制另外一个线程,达到线程的同步目的;
事件是一个内核对象,可以对不同进程中的线程进行同步;
// Event.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "conio.h"
#include "windows.h"
#define BUFFER 10
HANDLE g_hEvent = NULL;
DWORD WINAPI SendProc( LPVOID pParam )
{
while( 1 )
{
SetEvent( g_hEvent );
Sleep( 1000 );
}
return 0;
}
DWORD WINAPI RecvProc( LPVOID pParam )
{
LONG nIndex = 0;
while( 1 )
{ //等候事件信号
WaitForSingleObject( g_hEvent, INFINITE );
printf( "Recv Proc %d\n", nIndex );
nIndex++;
//重置事件为无信号状态
ResetEvent( g_hEvent );
}
return 0;
}
void Event( )
{ //创建事件
g_hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
DWORD nThreadID = 0;
HANDLE hThread[2] = { 0 };
hThread[0] = CreateThread( NULL, 0, RecvProc,NULL, 0, &nThreadID );
hThread[1] = CreateThread( NULL, 0, SendProc,NULL, 0, &nThreadID );
WaitForMultipleObjects( 2, hThread, TRUE, INFINITE );
CloseHandle( hThread[0] );
CloseHandle( hThread[1] );
//关闭事件
CloseHandle( g_hEvent );
}
int main(int argc, char* argv[])
{
Event();
getch( );
return 0;
}