Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rdemeter
GitHub Repository: rdemeter/so
Path: blob/master/lab8/mutex.c
224 views
1
#include <stdio.h>
2
#include <pthread.h>
3
4
#define NUM_THREADS 5
5
6
// mutex global
7
pthread_mutex_t mutex;
8
int global_counter = 0;
9
10
void *thread_routine(void *arg) {
11
// preluam mutexul global
12
pthread_mutex_lock(&mutex);
13
// afisam si modificam valoarea variabilei globale 'global_counter'
14
printf("Thread %d says global_counter=%d\n", (int) arg, global_counter);
15
global_counter ++;
16
17
// eliberam mutexul pentru a acorda acces altui fir de executie
18
pthread_mutex_unlock(&mutex);
19
return NULL;
20
}
21
22
int main(void) {
23
int i;
24
pthread_t tids[NUM_THREADS];
25
26
// mutexul este initializat o singura data si folosit de toate firele de executie
27
pthread_mutex_init(&mutex, NULL);
28
29
// firele de executie vor executa codul functiei 'thread_routine'
30
// in locul unui pointer la date utile, se trimite in ultimul argument
31
// un intreg - identificatorul firului de executie
32
for (i = 0; i < NUM_THREADS; i++)
33
pthread_create(&tids[i], NULL, thread_routine, (void *) i);
34
35
// asteptam ca toate firele de executie sa se termine
36
for (i = 0; i < NUM_THREADS; i++)
37
pthread_join(tids[i], NULL);
38
39
// eliberam resursele mutexului
40
pthread_mutex_destroy(&mutex);
41
return 0;
42
}
43
44
45