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 :
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
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;
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 ?![]()
Partager