/* Unnamed semaphores and pthreads. */ #include #include #include #include #include #include #include #include "array.h" #define massert( cond, msg ) \ if( cond ) { \ perror( msg ); \ exit(-1); \ } char buf[] = "abcdefghijklmnopqrstuvwsyz"; sema_t sem_main, sem_inv, sem_rev; void *inv( void *data ) { int len = strlen(buf); while( 1 ) { sema_wait( &sem_inv ); inverse(buf, len); sema_post( &sem_main); } } void *rev( void* data ) { int len = strlen(buf); while( 1 ) { sema_wait( &sem_rev ); reverse(buf, len); sema_post( &sem_main); } } int main( int argc, char* argv[] ) { pthread_t inv_pthread, rev_pthread; massert(pthread_create( &inv_pthread, NULL, inv, NULL ), "pthread" ); massert(pthread_create( &rev_pthread, NULL, rev, NULL ), "pthread" ); massert(sema_init( &sem_main, 0, USYNC_THREAD, NULL), "sema_init" ); massert(sema_init( &sem_inv , 0, USYNC_THREAD, NULL), "sema_init" ); massert(sema_init( &sem_rev , 0, USYNC_THREAD, NULL), "sema_init" ); while(1) { sema_post( &sem_inv ); sema_wait( &sem_main ); puts(buf); sleep(1); sema_post( &sem_rev ); sema_wait( &sem_main ); puts(buf); sleep(1); } pthread_exit(NULL); return 0; }