Bonsoir a tous. Ca fait pas longtemps que je me suis initié aux threads grace notamment au superbe tutos presents dans ce site. Cependant, il y a quelque chose que j'arrive pas a assimiler. Et je tiens beaucoup a avoir la réponse sur ce point.
Je vais commencer par poster le code de la partie concernée. En fait, ça concerne les conditions. Je poste la fonction store et la fonction client :
Celle des clients :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 static void * fn_store (void * p_data) { while (1) { /* Debut de la zone protegee. */ pthread_mutex_lock (& store.mutex_stock); pthread_cond_wait (& store.cond_stock, & store.mutex_stock); store.stock = INITIAL_STOCK; printf ("Remplissage du stock de %d articles !\n", store.stock); pthread_cond_signal (& store.cond_clients); pthread_mutex_unlock (& store.mutex_stock); /* Fin de la zone protegee. */ } return NULL; }
Lorsque le programme commence, on suppose que le thread de la fonction store est le premier a atteindre le mutex. Il le verrouille donc, et continue son parcours jusqu'à trouver la fonction pthread_cond_wait. Il block alors sur cette ligne, et libère le mutex. Ensuite l'un des thread des clients atteint a son tour le mutex, il le verrouille donc. Supposons que la quantité ne soit pas suffisante. Il entre alors dans le if et rencontre l'instruction pthread_cond_signal. Le thread de store se réveille alors et reverrouille le mutex.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 static void * fn_clients (void * p_data) { int nb = (int) p_data; while (1) { int val = get_random (6); psleep (get_random (3)); /* Debut de la zone protegee. */ pthread_mutex_lock (& store.mutex_stock); if (val > store.stock) { pthread_cond_signal (& store.cond_stock); pthread_cond_wait (& store.cond_clients, & store.mutex_stock); } store.stock = store.stock - val; printf ( "Client %d prend %d du stock, reste %d en stock !\n", nb, val, store.stock ); pthread_mutex_unlock (& store.mutex_stock); /* Fin de la zone protegee. */ } return NULL; }
Mon problème c'est que comment ca se fait que le mutex soit reverouillé par le thread de store alors qu'il est deja verrouillé par le thread de la fonction du client?
J'espère que vous avez compris. Si vous avez besoin d'explication n'hésitez pas. Merci d'avance.
Partager