///////////////////////////////////////////////////////////////////////////// // Creation 18/12/2003 // // // SEMAPHORE.C // ----------- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // // Show how to use semaphore under WIN32 // ///////////////////////////////////////////////////////////////////////////// #include #include DWORD WINAPI ThreadProc( LPVOID lpParameter ); static CRITICAL_SECTION s_cs; void main() { HANDLE hSem; DWORD dwThreadID; LONG PreviousCount; InitializeCriticalSection(&s_cs); hSem = CreateSemaphore( NULL, 0, 2, NULL ); CreateThread( NULL, 0, ThreadProc, (LPVOID)hSem, 0, &dwThreadID ); CreateThread( NULL, 0, ThreadProc, (LPVOID)hSem, 0, &dwThreadID ); Sleep( 1000 ); printf( "ReleaseSemaphore()\n" ); ReleaseSemaphore( hSem, 2, &PreviousCount ); Sleep( INFINITE ); } static void PrintThread( char * sz ) { EnterCriticalSection( &s_cs ); printf( "%s - thread (%d)\n", sz, GetCurrentThreadId() ); LeaveCriticalSection( &s_cs ); } DWORD WINAPI ThreadProc( LPVOID lpParameter ) { HANDLE hSem = (HANDLE)lpParameter; PrintThread( "Waiting for the semaphore" ); if( WaitForSingleObject( hSem, INFINITE ) == WAIT_OBJECT_0 ) PrintThread( "Semaphore OK" ); else printf( "WaitForSingleObject() error (%d)\n", GetLastError() ); return 0; }