/**************************************************************************** * * * Arquivo EstudoDirigidoX.c criado por Gabriel Barbosa (12/0050935) * * DESCRICAO DO PROBLEMA * * Codigo multiplataforma * * Usar flags -std=c11 -lpthread para compilar para Windows * * Usar flags -std=c11 -pthread para compilar para Linux * * * ****************************************************************************/ #ifdef _WIN32 #include #define SLEEP(ms) Sleep(ms) #else #define _BSD_SOURCE #include #define SLEEP(ms) usleep( 1000*(ms) ) #endif #define RAND_INTERVAL(min, max) ( rand()%( (max) - (min) ) + (min) ) #define RAND_INTERVAL2(mid, rng) ( rand()%( 2 * (rng) ) + (mid) - (rng) ) #include #include #include #include #include #define MIN_WAIT 3750 // Tempo minimo em ms #define MAX_WAIT 6250 // Tempo maximo em ms #define N_THREADS 10 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_barrier_t barrier; sem_t semaphore; int count = 0; void* thread0_main( void* arg ); int main( int argc, char* argv[] ) { pthread_t thread[N_THREADS]; pthread_barrier_init( &barrier, NULL, 2 ); sem_init( &semaphore, 0, 1 ); srand( time(NULL) ); int* arg; for( int i = 0; i < N_THREADS; i++ ) { arg = (int*) malloc( sizeof(int) ); *arg = rand(); pthread_create( thread+i, NULL, thread0_main, arg ); } pthread_join( thread[0], NULL ); return 0; } void* thread0_main( void* arg ) { int myArg = *((int*)arg); free( arg ); srand( myArg ); SLEEP( RAND_INTERVAL( MIN_WAIT, MAX_WAIT ) ); pthread_exit(0); }