Compilação de um programa C com suporte as threads POSIX: gcc teste_thread.c -oteste_thread -lpthread
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 <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <pthread.h> #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 <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <pthread.h> #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; }