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 : 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;
}
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...