#include #include #include #include #include #include #include #include //~ HANDLE hEvent1, hEvent2; int key = 0x20; // Semaphore key int a[ 5 ]; void Thread( void* pParams ) { // Thread 2 struct sembuf operation[1] ; // open semaphore int mysemid = semget(key, 2, 0); operation[0].sem_op = 1; // Release on the second resource operation[0].sem_num = 1; operation[0].sem_flg = SEM_UNDO; //Release semaphore 2 semop(mysemid, operation, 1); int i, num = 0; while ( 1==1 ) { WaitForSingleObject( hEvent2, INFINITE ); for ( i = 0; i < 5; i++ ) a[ i ] = num; SetEvent( hEvent1 ); num++; } } int main( void ) { // Thread 1 struct sembuf operation[2] ; // Create 2 semaphores semid = semget(key, 2, 0666 | IPC_CREAT); operation[0].sem_op = 1; //Release first resource operation[0].sem_num = 0; operation[0].sem_flg = SEM_UNDO; operation[0].sem_op = -1; // Wait on the second resource operation[0].sem_num = 1; operation[0].sem_flg = SEM_UNDO; //Release semaphore 1 and wait on semaphore 2 // note : thread is suspended until the semaphore 2 is released. semop(semid, operation, 2); // thread is released // delete the semaphore semctl(semid, 0, IPC_RMID , 0) hEvent1 = CreateEvent( NULL, FALSE, TRUE, NULL ); hEvent2 = CreateEvent( NULL, FALSE, FALSE, NULL ); _beginthread( Thread, 0, NULL ); while( 1==1 ) { WaitForSingleObject( hEvent1, INFINITE ); printf( "%d %d %d %d %d\n", a[ 0 ], a[ 1 ], a[ 2 ], a[ 3 ], a[ 4 ] ); SetEvent( hEvent2 ); } return 0; }