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++

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    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 : 108
Taille : 38,2 Ko

    Merci.
    Bonne fin de journée!

    Nicolas
    Images attachées Images attachées  

  2. #2
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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