2 pièce(s) jointe(s)
[Multi-threading] Probleme avec les mutex
Bonjour,
Je veux simplement mettre en évidence la mutuelle exclusion dans un environnement multi-thread.
Pour cela j'ai créé trois thread qui accèdent en écriture à une variable globale. Dans la zone protégée, j'ai donc incrémenté la variable globale et insérer des printf() pour savoir quel thread est entrain d'utiliser la variable.
Mais voilà que je constate, que la zone protégée ne l'est pas du tout et tout les threads peuvent accéder en même temps à cette zone.
Si vous pourriez me dire pourquoi et d'ou vient mon erreur?
Voici une partie du code (je ne mets pas la création des threads):
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
/****************************************************************
* threadFunc0:
*
* 06/03/2007
****************************************************************/
DWORD WINAPI threadFunc0 (LPVOID lpParameter)
{
InitializeCriticalSection(&m_sectionCr);
int i = *(int*) lpParameter;
bool bEndThread = false;
while(!bEndThread)
{
writeVar(i);
bEndThread = true;
}
return 0;
}
/****************************************************************
* threadFunc1:
*
* 06/03/2007
****************************************************************/
DWORD WINAPI threadFunc1 (LPVOID lpParameter)
{
InitializeCriticalSection(&m_sectionCr);
int i = *(int*) lpParameter;
bool bEndThread = false;
while(!bEndThread)
{
writeVar(i);
bEndThread = true;
}
return 0;
}
/****************************************************************
* threadFunc2:
*
* 06/03/2007
****************************************************************/
DWORD WINAPI threadFunc2 (LPVOID lpParameter)
{
InitializeCriticalSection(&m_sectionCr);
int i = *(int*) lpParameter;
bool bEndThread = false;
while(!bEndThread)
{
writeVar(i);
bEndThread = true;
}
return 0;
}
/****************************************************************
* writeVar:
*
* 06/03/2007
****************************************************************/
void writeVar (int i)
{
InitializeCriticalSection(&m_sectionCr);
EnterCriticalSection(&m_sectionCr);
printf("\n---Debut section critique: writeVar()---\n");
printf("Thread %c: m_iVal = %d\n",i,m_iVal);
m_iVal++;
Sleep(1000);
printf("Thread %c: m_iVal = %d\n",i,m_iVal);
printf("---Fin section critique: writeVar()---\n");
LeaveCriticalSection(&m_sectionCr);
} |
Note: la variable i coorespond au numéri du thread.
Et voici les résultats obtenus pou une tentative mais ca reste toujours du meme genre si je relance mon appli:
Pièce jointe 10437
Merci.
Bonne fin de journée! ;)
Nicolas