Tabela de conteúdos

Threads POSIX

Compilação de um programa C com suporte as threads POSIX: gcc teste_thread.c -oteste_thread -lpthread

Funções

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 <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;
}