/* * Synchronization via POSIX Semaphores */ #include #include #include #include #include #include int coin_flip; sem_t coin_flip_done; // semaphore for thread 1 to signal coin flip static void * thread1(void *_) { coin_flip = rand() % 2; sem_post(&coin_flip_done); // raise semaphore, increment, 'up' printf("Thread 1: flipped coin %d\n", coin_flip); return NULL; } static void * thread2(void *_) { sem_wait(&coin_flip_done); // wait until semaphore is raised, // then decrement, 'down' printf("Thread 2: flipped coin %d\n", coin_flip); return NULL; } int main() { int i, N = 2; pthread_t t[N]; srand(getpid()); sem_init(&coin_flip_done, 0, 0); pthread_create(&t[1], NULL, thread2, NULL); pthread_create(&t[0], NULL, thread1, NULL); for (i = 0; i < N; i++) pthread_join(t[i], NULL); return 0; }