/************************************************************************
** Event 事件
** 同步机制中最富有弹性的机制了。唯一的目的就是成为激发状态或未激发状态
** 而这两种状态完全由程序控制。所以你可以精确告诉一个Event对象做什么事
** 以及什么时候去做。
**
** 主要函数:
** CreateEvent
** OpenEvent
** SetEvent
** ResetEvent
** PulseEvent
** 参考资料
** http://www.codeproject.com/Articles/438/Introduction-to-Multi-threaded-Code
************************************************************************/
#include <windows.h>
#include <process.h>
#include <stdio.h>
HANDLE hEvent1, hEvent2;
int a[ 5 ];
HANDLE hManualEvent;
const int LOOP_COUNT = 10;
UINT __stdcall Thread( void* pParams )
{
int num = 1;
for( int k=0; k < LOOP_COUNT; k++ )
{
WaitForSingleObject( hEvent2, INFINITE );
for ( int i = 0; i < 5; i++ ) a[ i ] = num;
SetEvent( hEvent1 );
num++;
}
return 0;
}
UINT __stdcall ManualThread( void* pParams )
{
for ( int k = 0; k < LOOP_COUNT; k++ )
{
WaitForSingleObject( hManualEvent, INFINITE );
printf( "ManualThread is working %d\n", k );
// 把手动的Event改为无信号状态
if ( k == 5 )
{
ResetEvent( hManualEvent );
_endthreadex( 0 );
}
}
return 0;
}
int main( void )
{
hEvent1 = CreateEvent(
NULL,
FALSE, // 是否手动
TRUE, // 初始化时是否有信号
NULL );
hEvent2 = CreateEvent( NULL, FALSE, FALSE, NULL );
// 手动的Event
hManualEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
UINT threadID = 0;
_beginthreadex( NULL, 0, Thread, NULL, 0, &threadID );
HANDLE hHandle = (HANDLE)_beginthreadex( NULL, 0, ManualThread, NULL, 0, 0 );
// 将手动的Event改为有信号状态
SetEvent( hManualEvent );
for( int k=0; k < LOOP_COUNT; k++ )
{
WaitForSingleObject( hEvent1, INFINITE );
printf( "%d %d %d %d %d\n",
a[ 0 ], a[ 1 ], a[ 2 ],
a[ 3 ], a[ 4 ] );
SetEvent( hEvent2 );
}
WaitForSingleObject( hHandle, INFINITE );
printf("***** Finish ******!");
return 0;
}