Event事件
/************************************************************************ ** 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; }