// to compile: gcc ex2.c -o ex2 -lpthread // to execute: ex2 // Code uses POSIX Semaphores (IEEE Std 1003.1b). // // copyrights: Paulo S. L. de Souza and Davi J. Conte // #include #include #include #include #define THREADS 6 #define MAXITER 10 //global sem_t permit[THREADS]; // um semáforo para cada thread sem_t sem_master; int iter; // função para threads 1 void *slave1(void *p_arg){ int p, next; p = (int) *((int *)p_arg); next = p + 1; while(1){ sem_wait(&permit[p]); if(iter == MAXITER){ pthread_exit(0); } printf("Thread(1) %d, iter = %d\n", p, iter); sem_post(&permit[next]); } } // função para threads 2 void *slave2(void *p_arg){ int p, next; p = (int) *((int *)p_arg); while(1){ sem_wait(&permit[p]); if(iter == MAXITER){ pthread_exit(0); } printf("Thread(2) %d, iter = %d\n", p, iter); sem_post(&sem_master); } } int main(void){ pthread_t handle[THREADS]; int i, p[THREADS], initial = 0; sem_init(&sem_master, 0, initial); // cria threads e semáforos for (i=0; i < THREADS; i++) { p[i] = i; sem_init (&permit[i], 0 , initial); if (i%2 == 0){ if (pthread_create(&handle[ i ], 0, (void *) slave1, (void *) &p[ i ] ) != 0) { printf("Error creating thread %d! Exiting! \n", i); fflush(0); exit(0); } }else{ if (pthread_create(&handle[ i ], 0, (void *) slave2, (void *) &p[ i ] ) != 0) { printf("Error creating thread %d! Exiting! \n", i); fflush(0); exit(0); } } } // loop iter for(iter=0; iter