Bonjour,
J'ai un soucis avec l'utilisation des conditions et des mutex. J'ai isolé le problème sous la forme du programme suivant :
En gros je souhaite que 2 threads se synchronisent par l'intermédiaire d'une condition (qui utilise "mutex2") et que le programme principal effectue un traitement particulier uniquement lorsque les 2 threads ne sont pas synchronisés (d'où l'utilisation de "mutex1").
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 #include <stdio.h> #include <stdbool.h> #include <string.h> #include "SDL.h" #include "SDL_thread.h" static SDL_mutex * mutex2; static SDL_cond * cond; static SDL_Thread * cu; static SDL_mutex * mutex1; static bool update = false; /* * Cette focntion demande et attend une mise à jour. */ static int demandeMaj(void* unused){ while (1){ SDL_mutexP(mutex1); SDL_mutexP(mutex2); update = true; /* Demander la mise à jour */ SDL_CondWait(cond, mutex2); /* attendre la mise à jour */ SDL_mutexV(mutex2); SDL_mutexV(mutex1); } return 0; } /* * Cette fonction réalise une mise à jour d'un ensemble de donnée si elle a été * demandé */ static int maj(void* unused){ while (1){ SDL_mutexP(mutex2); /* Vérifier si une mise à jour est nécessaire */ if (update){ update = false; SDL_Delay(100); /* symbolise le temps pris par la mise à jour */ SDL_CondSignal(cond); /* indiquer que la mise à jour est terminée */ } SDL_mutexV(mutex2); } return 0; } int main() { mutex2 = SDL_CreateMutex(); cond = SDL_CreateCond(); mutex1 = SDL_CreateMutex(); SDL_Thread * th1 = SDL_CreateThread(demandeMaj, NULL); SDL_Thread * th2 = SDL_CreateThread(maj, NULL); SDL_Delay(1000); /* Effectuer un traitement particulier uniquement lorsque "demandeMaj" n'est * pas en synchronisation avec "maj" */ SDL_mutexP(mutex1); printf("un traitement particulier\n"); SDL_mutexV(mutex1); return 0; }
Le problème est que le programme principal n'arrive pas à prendre le mutex1 et donc n'affiche jamais "un traitement particulier". Or, si je commente le "SDL_CondWait(cond, mutex2);" et le "SDL_CondSignal(cond);" (ce qui n'est pas correct car les 2 threads n'ont plus de rdv) alors le main parvient à prendre le mutex1 et affiche le message.
Comment ce fait-il que la présence de la condition perturbe le mutex1?
Ai-je fait une erreur? Est-ce un bug de la SDL?
Comment faire pour maintenir le Rdv tout en le protégeant du programme principal?
Merci d'avance pour vos réponses...
Partager