/*
* Exemplo de uso de Pthreads em C
* Compile com:
* gcc -pthread main.c -o prog
* Ou, em IDEs online, marque “Run with pthread support”.
*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 5
// Função que cada thread irá executar
void* rotina(void* arg) {
int id = *(int*)arg;
printf("Olá do thread %d!\n", id
); // Simula trabalho
for (int i = 0; i < 3; i++) {
printf("Thread %d em execução, passo %d\n", id
, i
+ 1); }
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
int rc;
// Cria as threads
for (int i = 0; i < NUM_THREADS; i++) {
thread_ids[i] = i;
rc = pthread_create(&threads[i], NULL, rotina, &thread_ids[i]);
if (rc) {
fprintf(stderr
, "Erro ao criar a thread %d, código %d\n", i
, rc
); }
}
// Aguarda término de todas as threads
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
printf("Todas as threads finalizaram. Programa encerrado.\n"); return 0;
}
LyoKICogRXhlbXBsbyBkZSB1c28gZGUgUHRocmVhZHMgZW0gQwogKiBDb21waWxlIGNvbToKICogICBnY2MgLXB0aHJlYWQgbWFpbi5jIC1vIHByb2cKICogT3UsIGVtIElERXMgb25saW5lLCBtYXJxdWUg4oCcUnVuIHdpdGggcHRocmVhZCBzdXBwb3J04oCdLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CgojZGVmaW5lIE5VTV9USFJFQURTIDUKCi8vIEZ1bsOnw6NvIHF1ZSBjYWRhIHRocmVhZCBpcsOhIGV4ZWN1dGFyCnZvaWQqIHJvdGluYSh2b2lkKiBhcmcpIHsKICAgIGludCBpZCA9ICooaW50Kilhcmc7CiAgICBwcmludGYoIk9sw6EgZG8gdGhyZWFkICVkIVxuIiwgaWQpOwogICAgLy8gU2ltdWxhIHRyYWJhbGhvCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgIHByaW50ZigiVGhyZWFkICVkIGVtIGV4ZWN1w6fDo28sIHBhc3NvICVkXG4iLCBpZCwgaSArIDEpOwogICAgfQogICAgcHRocmVhZF9leGl0KE5VTEwpOwp9CgppbnQgbWFpbigpIHsKICAgIHB0aHJlYWRfdCB0aHJlYWRzW05VTV9USFJFQURTXTsKICAgIGludCB0aHJlYWRfaWRzW05VTV9USFJFQURTXTsKICAgIGludCByYzsKCiAgICAvLyBDcmlhIGFzIHRocmVhZHMKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgewogICAgICAgIHRocmVhZF9pZHNbaV0gPSBpOwogICAgICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbaV0sIE5VTEwsIHJvdGluYSwgJnRocmVhZF9pZHNbaV0pOwogICAgICAgIGlmIChyYykgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm8gYW8gY3JpYXIgYSB0aHJlYWQgJWQsIGPDs2RpZ28gJWRcbiIsIGksIHJjKTsKICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBBZ3VhcmRhIHTDqXJtaW5vIGRlIHRvZGFzIGFzIHRocmVhZHMKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgewogICAgICAgIHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKICAgIH0KCiAgICBwcmludGYoIlRvZGFzIGFzIHRocmVhZHMgZmluYWxpemFyYW0uIFByb2dyYW1hIGVuY2VycmFkby5cbiIpOwogICAgcmV0dXJuIDA7Cn0K
Olá do thread 4!
Thread 4 em execução, passo 1
Thread 4 em execução, passo 2
Thread 4 em execução, passo 3
Olá do thread 3!
Thread 3 em execução, passo 1
Thread 3 em execução, passo 2
Thread 3 em execução, passo 3
Olá do thread 2!
Thread 2 em execução, passo 1
Thread 2 em execução, passo 2
Thread 2 em execução, passo 3
Olá do thread 1!
Thread 1 em execução, passo 1
Thread 1 em execução, passo 2
Thread 1 em execução, passo 3
Olá do thread 0!
Thread 0 em execução, passo 1
Thread 0 em execução, passo 2
Thread 0 em execução, passo 3
Todas as threads finalizaram. Programa encerrado.