#include <stdio.h>1#include <pthread.h>23#define NUM_THREADS 545// mutex global6pthread_mutex_t mutex;7int global_counter = 0;89void *thread_routine(void *arg) {10// preluam mutexul global11pthread_mutex_lock(&mutex);12// afisam si modificam valoarea variabilei globale 'global_counter'13printf("Thread %d says global_counter=%d\n", (int) arg, global_counter);14global_counter ++;1516// eliberam mutexul pentru a acorda acces altui fir de executie17pthread_mutex_unlock(&mutex);18return NULL;19}2021int main(void) {22int i;23pthread_t tids[NUM_THREADS];2425// mutexul este initializat o singura data si folosit de toate firele de executie26pthread_mutex_init(&mutex, NULL);2728// firele de executie vor executa codul functiei 'thread_routine'29// in locul unui pointer la date utile, se trimite in ultimul argument30// un intreg - identificatorul firului de executie31for (i = 0; i < NUM_THREADS; i++)32pthread_create(&tids[i], NULL, thread_routine, (void *) i);3334// asteptam ca toate firele de executie sa se termine35for (i = 0; i < NUM_THREADS; i++)36pthread_join(tids[i], NULL);3738// eliberam resursele mutexului39pthread_mutex_destroy(&mutex);40return 0;41}42434445