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

Threads & Processus C++ Discussion :

Question Critical Section


Sujet :

Threads & Processus C++

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 97
    Points : 55
    Points
    55
    Par défaut Question Critical Section
    Bonjour !

    J'ai une petite question concernant les Critical Section.

    J'ai un objet de la classe A. J'éxecute un code du type suivant dans ma boite de dialogue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A monObjet;
    CRITICAL_SECTION cs;
    InitializeCriticalSection(&cs);
     
    EnterCriticalSection(&cs);
     
          monObjet.UneFonction();
     
    LeaveCriticalSection(&cs);
    Est ce que le corps de UneFonction fait ou non partie du code protégé par la Critical Section ? Le fait que la fonction soit d'une autre classe gene t il ?
    Dois je remettre des Enter / Leave dans le corps de la fonction ???

    Merci pour votre aide !!!

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Oui, c'est protégé.

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Non, il ne l'est pas : rien ne t'empêches d'appeler, ailleurs dans le code, "monObjet.UneFonction()" de façon non protégée. Dans l'exemple que tu as donné, il n'y a que cet appel particulier à UneFonction qui est sous la CS, mais pas forcément les appels concurrents.

    Si tu veux le garantir, il faut, au choix :
    1. Déplacer les appels à EnterCriticalSection et LeaveCriticalSection dans le corps de "UneFonction", ce qui la protègera quel que soit l'endroit ou la manière de l'appeler. Ta fonction devient en fait thread-safe.
    2. Vérifier et/ou garantir que tous les appels à "UneFonction" seront bien TOUS encadrés par les appels à EnterCriticalSection et LeaveCriticalSection.
      Ta fonction n'est pas thread-safe, mais tu protèges à un niveau plus élevé tous les appels potentiellement concurrents, donc le problème de réentrance ne se produira pas.

    Si ta CS doit protéger d'autres éléments, il est préférable d'utiliser la deuxième solution. Si elle ne doit protéger QUE la méthode "UneFonction", alors la première est préférable.
    Tu peux même faire les deux : une fois la CS acquise par un thread, tu peux appeler autant de fois que tu veux EnterCriticalSection, cela ne provoquera pas de deadlock. Il faut juste veiller à équilibrer le nombre d'appels à LeaveCriticalSection.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 97
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    Un grand merci un peu tardif pour cette réponde claire et limpide qui m'a beaucoup aidé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Multithread] Mutex versus Critical Section ?
    Par runn2 dans le forum Visual C++
    Réponses: 2
    Dernier message: 06/10/2006, 09h29
  2. Réponses: 2
    Dernier message: 03/05/2006, 17h07
  3. [VC7] Multithread et Critical section
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 05/05/2005, 14h04

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