IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

[Multi-threading] Probleme avec les mutex


Sujet :

Visual C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �m�rite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par d�faut [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 : 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
    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:
    Nom : resultat_MUTEX.JPG
Affichages : 123
Taille : 38,2 Ko

    Merci.
    Bonne fin de journ�e!

    Nicolas
    Images attach�es Images attach�es  

  2. #2
    Membre �m�rite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par d�faut
    Juste comme cela, au lieu d'utiliser les fonctions pr�c�dentes pour g�rer la mutex, j'utilise un s�maphore � un ticket et l�, pas de probl�me!

    Sur la msdn, je viens de lire ceci, j'avais du rater ce passage:
    A critical section object must be deleted before it can be reinitialized. Initializing a critical section that has already been initialized results in undefined behavior.
    Peut �tre que mon probl�me vient d'ici. Je ne comprends pas trop o�initialiser correctement la zone critique...

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    G�n�ralement, la section critique, tu l'initialises uniquement � sa cr�ation.
    Comme il s'agit d'une variable globale, soit tu en fais une classe RAII (comme CCriticalSection de MFC) et tu l'initialises dans le constructeur, soit tu l'initialises une fois pour toutes dans le main avant de lancer tout autre thread.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. probleme avec les thread
    Par ashurah dans le forum Concurrence et multi-thread
    R�ponses: 15
    Dernier message: 26/03/2010, 14h05
  2. Probleme avec les Threads
    Par ouxss dans le forum C++
    R�ponses: 2
    Dernier message: 05/01/2010, 10h27
  3. Probleme avec les threads
    Par Loenix dans le forum G�n�ral Python
    R�ponses: 4
    Dernier message: 04/06/2009, 14h50
  4. Probleme avec les thread
    Par jonny dans le forum MFC
    R�ponses: 11
    Dernier message: 01/06/2006, 17h37
  5. Probleme avec les threads
    Par Orahn dans le forum MFC
    R�ponses: 5
    Dernier message: 04/11/2005, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo