Bonjour.

J'ai décidément du mal avec les mutex.

J'ai une petite portion de code toute simple qui peut être appelée par plusieurs threads en simultanée, aussi, je l'ai protégé par un mutex.
De temps en temps, ça se bloque à l'appel de la fonction WaitForSingleObject, et je ne comprends vraiment pas pourquoi.

Voici mon code :
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
        TraceMessageV02(UnMessage,'TestConnexion','1;Valeur mutex ping;'+inttostr(g_MuPing));
        if(g_MuPing = 0)then
        begin
            g_MuPing := CreateMutex(nil, false, PChar(sNomMutex));
            TraceMessageV02(UnMessage,'TestConnexion','1;Create mutex ping;'+inttostr(g_MuPing));
        end;
        if (GetLastError=ERROR_ALREADY_EXISTS) then
        begin
            g_MuPing := OpenMutex(MUTEX_ALL_ACCESS , false, PChar(sNomMutex));
            TraceMessageV02(UnMessage,'TestConnexion','1;open mutex ping;'+inttostr(g_MuPing));
        end;
        try
            TraceMessageV02(UnMessage,'TestConnexion','1;Attente mutex ping;'+inttostr(g_MuPing));
            WaitForSingleObject(g_MuPing,INFINITE); // <= Bloque ici, mais pas au premier passage !
            TraceMessageV02(UnMessage,'TestConnexion','1;Mutex ping obtenu;'+inttostr(g_MuPing));
            {Traitements divers}{
            .
            .
            .
            {Traitements divers}
            {Traitements divers}
        Finally
            TraceMessageV02(UnMessage,'TestConnexion','1;Libération du mutex ping;'+inttostr(g_MuPing));
            ReleaseMutex(g_MuPing);
            TraceMessageV02(UnMessage,'TestConnexion','1;Mutex ping libéré;'+inttostr(g_MuPing));
        end;
Et voici la trace générée (ralentie pour l'exemple, en réalité, c'est plus rapide que la seconde) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Date			Application	NomFonction	Message				handle du mutex ping		
19/10/2006 11:15:11	Dtt.dll () 	TestConnexion 	Attente mutex ping		3264	 	<= Bloqué !
19/10/2006 11:15:10	Dtt.dll () 	TestConnexion 	Valeur mutex ping		3264	 	
19/10/2006 11:15:09	Dtt.dll () 	TestConnexion 	Mutex ping libéré		3264	 	
19/10/2006 11:15:08	Dtt.dll () 	TestConnexion 	Libération du mutex ping	3264	 	
19/10/2006 11:15:07	Dtt.dll () 	TestConnexion 	Mutex ping obtenu		3264	 	
19/10/2006 11:15:06	Dtt.dll () 	TestConnexion 	Attente mutex ping		3264	 	
19/10/2006 11:15:05	Dtt.dll () 	TestConnexion 	Create mutex ping		3264	 	
19/10/2006 11:15:04	Dtt.dll () 	TestConnexion 	Valeur mutex ping		0

Voyez vous quelque chose de dangeureux pour mon code ?