problème de mutex et de condition
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 :
Code:
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;
} |
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").
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...