====== Threads POSIX ====== Compilação de um programa C com suporte as threads POSIX: ''gcc teste_thread.c -oteste_thread -lpthread'' ===== Funções ===== * [[pthread_detach]] * [[pthread_self]] * [[pthread_exit]] * [[pthread_create]] * [[pthread_join]] * [[pthread_mutex_lock]] * [[pthread_mutex_lock]] ===== Concorrência entre threads ===== Este programa não implementa a concorrência de acesso a variável ''iContador''. Compile e execute este programa várias vezes para perceber o erro. #include #include #include #include #include #include #define LOOP 50 int iContador; void * teste_thread(void * pArg ) { int i, old; for( i = 0; i < LOOP; i++) { old = iContador; printf("\n%d: %d", pthread_self(), old); iContador = old + 1; } pthread_exit(0); } int main(void) { pthread_t tidA, tidB; iContador = 0; pthread_create(&tidA, NULL, teste_thread, NULL); pthread_create(&tidB, NULL, teste_thread, NULL); printf("\nEsperando A terminar"); pthread_join(tidA, NULL); printf("\nEsperando B terminar"); pthread_join(tidB, NULL); return 0; } Este programa implementa a concorrência de acesso a variável ''iContador''. Compile e execute este programa várias vezes e você perceberá que não ocorrerá erro. #include #include #include #include #include #include #include #include #include #include #define LOOP 50 pthread_mutex_t contador_mutex = PTHREAD_MUTEX_INITIALIZER; int iContador; void * teste_thread(void * pArg ) { int i, old; for( i = 0; i < LOOP; i++) { pthread_mutex_lock(&contador_mutex); old = iContador; printf("\n%d: %d", pthread_self(), old+1); iContador = old + 1; pthread_mutex_unlock(&contador_mutex); sleep(1); } pthread_exit(0); } int main(void) { pthread_t tidA, tidB; iContador = 0; pthread_create(&tidA, NULL, teste_thread, NULL); pthread_create(&tidB, NULL, teste_thread, NULL); printf("\nEsperando A terminar"); pthread_join(tidA, NULL); printf("\nEsperando B terminar"); pthread_join(tidB, NULL); return; }