Mês: dezembro 2013

Rapido exemplo usando pthread.

A biblioteca pthread é um meio rápido e confiável de se criar aplicações multi-threads. Neste post será demonstrado um programa simples usando pthread.

  1. A biblioteca esta disponível no header <pthread.h> que deverá estar inclusa na compilação usando #include <pthread.h>.
  2. Criar a estrutura pthread_t para cada thread usado. Se for somente um pthread_t thread; será o suficiente caso contrário um ponteiro ou array de pthread_t será necessário como em pthread_t *threads;
  3. Criar a função que ficará separada do processo principal com tipo void e parametro *void. Como no exemplo void *Tarefa (void *param);
  4. Já criamos a estrutura e a função. Podemos então criar o thread usando pthread_create. Ela leva quatro parametros o primeiro a estrutura que criamos em 2; o segundo pode ser ignorado e passado NULL, o terceiro o ponteiro para a função (Tarefa) e finalmente o parametro (*void) para esta função (Tarefa (*void param)). Ao chamar pthread_create a tarefa (o thread) começa executando.
  5. Pronto já temos uma tarefa rodando em paralelo. Mas se esta tarefa tiver um fim precisamos esperar que ela termine antes que o processo principal termine antes e para isso usamos int pthread_join(pthread_t thread, void **value_ptr); que fica esperando pela tarefa identificada por pthread_t thread terminar e se esta retornou algum valor este estara guardado em void **value_ptr. Tenha em mente que esta função bloqueia a tarefa que a chamou até que a tarefa esperada termine.

Finalmente o código fica:


#include <pthread.h>
#include <stdio.h>

 void *Tarefa(void *param)
 {

 int *tx = (int *)param;
 int Fim = (*tx) + 20;

for (;(*tx) < Fim; (*tx)++;); // Incrementa X vinte vezes
 return NULL; // A tarefa não deverá retornar nada

}

int main()
 {

int x = 0, y = 0;

// Mostra antes
 printf("x: %d, y: %d\n ", x, y);

 pthread_t thread;

 if(pthread_create(&thread, NULL, Tarefa, &x)) {

fprintf(stderr, "Não deu certo a criação do thread\n");
 return 1;

}

 if(pthread_join(thread, NULL)) {

fprintf(stderr, "Falhou esperando fim da tarefa.\n");
 return 2;

}

// E finalmente o depois
 printf("x: %d, y: %d \n", x, y);

return 0;

}