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 :

Semaphore/Mutex ou section critique


Sujet :

Threads & Processus C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut Semaphore/Mutex ou section critique
    Bonjour a tous,

    Je me pose une question quand a la protection d'un objet dans un thread.
    Cet objet est envoyé cycliquement par mon thread P1.
    Cet objet peut être mis a jour par un autre thread.

    Je dois donc gérer l'accès a cet objet de façon a ne pas avoir de collision entre ma mise a jour et mon envoi.

    Seulement je suis un peu perdu sur quoi utiliser,
    J'ai pensé au sémaphore, OK.
    Pour le mutex si j'ai bien compris cela correspond a un sema a deux états,
    Et il y a également les sections critiques,

    Du coup j'ai utilisé les sections critiques en mettant un wxCriticalSectionLocker en début de mes deux méthodes de set et de send.
    (Il n'y a qu'un seul autre thread qui accede en ecriture, s'il y avait plusieurs thread en ecriture, cela change t il la donne ?)

    J'aimerai donc savoir que vaut il mieux utiliser dans un cas comme celui ci ?
    Car j'ai parcourus le forum et GG mais au final je suis toujours un peu perdu..

    Merci beaucoup d'avance,

    Bonne fin de journée

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Attention, je ne parle que pour l'environnement Microsoft :

    Une grosse différence en Mutex/Semaphore et section critique, c'est que les Mutex/Semaphore sont inter process alors que la section critique est inter thread seulement.

    Il n'est pas possible d'avoir une section critique nommée, elle est forcément anonyme et donc elle ne peut s'utiliser que entre 2 threads.

    Les Mutex/Semaphore peuvent être nommés et peuvent donc être utilisés en inter process.

    De plus, il me semble que le coût d'utilisation d'une section critique est moindre en termes de ressources (CPU/mémoire).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Dans mon cas j'ai un thread P1 qui utilise ma variable pour l'envoi.
    L'api de mise a jour permet a un autre thread de la modifier (il n'y a qu'un seul thread qui l'utilise).
    Donc ok pour les sections critiques.

    Voici un exemple du code:

    Une classe CSend lancant un thread via taskExec qui execute cycliquement la methode sendMsg qui envoi mMessage.
    Un autre thread peut modifier mMessage via setMsg.
    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
     
    class CSend :
    {
    ///////////////////////////////////
    // Déclarations des membres
    ///////////////////////////////////   
    private:
       CInfo                       mMessage;
       wxCriticalSection       mLockMsgCycle; 
    ///////////////////////////////////
    // Déclarations des methodes
    ///////////////////////////////////   
    private:
       int                   taskExec(void);
       int                   sendMsg( void );
    protected:
    public:
       void                 setMsg( CInfo *UserMsg );
     
       CSend();
       virtual ~CSend();
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CSend::setMsg(CInfo* aUserMsg)
    {
       wxCriticalSectionLocker lock(mLockMsgCycle);
       // ici je copie dans mMessage
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int CSend::sendMsg(void)
    {
       wxCriticalSectionLocker lock(mLockMsgCycle);
       // Ici j'envoie mMessage 
    }
    La section critique n'est donc utilisée que par 2 threads,
    Je ne comprend pas pourquoi si par la suite un troisième thread venait a vouloir modifier mMessage via setMsg, les sections critiques ne fonctionneraient plus.
    Edit: Est ce pour mettre une protection dans le cas ou plusieurs thread voudrait simultanément appeler setMsg ? En fait je résonnais uniquement du point de vue setMsg/sendMsg et non "multiples setMsg"/sendMsg
    Que dois je utiliser pour anticiper un tel mécanisme ?
    Du coup une section critique est un fait un mutex (deux etats) pouvant etre utiliser seulement entre deux threads ?

    Merci beaucoup d'avance

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Citation Envoyé par sone47 Voir le message
    Du coup une section critique est un fait un mutex (deux etats) pouvant etre utiliser seulement entre deux threads ?
    Presque : Du coup une section critique est un fait un mutex (deux états) pouvant être utilisée seulement entre deux ou plusieurs threads d'un même process.

    J'ai parlé de 2 threads dans ma 1ere réponse mais je sous entendais 2 ou plusieurs, désolé pour l'imprécision

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Merci beaucoup ram-0000 pour tes réponses ici et sur d'autres posts traitant du même sujet, que j'ai parcourus.
    J'ai une dernier, question surement idiote j'en suis desolé:
    Un thread appartient a un processus, un processus peut posseder plusieurs thread, ok.
    Dans l'appli que j'utilise je peux savoir combien de thread sont créés, mais pour les processus dont tu parles, cela équivaut a l'appli ?

    Merci d'avance

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Un petit exemple volontairement simpliste :

    notepad.exe est un fichier binaire sur le disque.

    Si tu cliques dessus, tu lances un process P1 (ou une instance de notepad) qui peut posséder plusieurs threads T1, T2, ...

    Si tu cliques une 2eme fois sur notepad exe, tu lances un 2eme process P2 qui peut possèder plusieurs threads T'1, T'2, ...

    Les thread T1 et T2 peuvent "partager" une section critique
    Les thread T'1 et T'2 peuvent "partager" une section critique

    mais le thread T1 ne peut partager de section critique avec T'1 et/ou T'2 car il ne sont pas dans le même process. Dans ce cas de figure, il faudra un mutex nommé ou un sémaphore nommé.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Ok, merci c'est bien ce que je supposais,
    Y a t il des exceptions, par ex créer plusieurs processus distinct a partir d'un pere ? Bon après ca sort du titre premier donc j'arrêterai, mais juste pour savoir si l'équation "gestion de threads au sein d'une appli = gestion de threads au sein d'un processus" est vrai et donc ne pas me soucier de savoir si plusieurs process dans l'appli..

    En tout cas merci beaucoup pour ces infos ram-0000 ,
    Bonne fin journée

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    2 processus différents (même s'ils sont des instances du même fichier binaire) possèdent 2 espaces mémoire différents. Les espaces mémoires sont différents et protégés. Un process ne peut atteindre l'espace mémoire d'un autre process (sauf cas très très particuliers de debug).

    2 threads (ou plus ) d'un même processus partagent le même espace mémoire.

    C'est pour cela qu'une variable globale (c'est laid) peut être manipulée par tous les thread d'un même processus. Une section critique peut être vue comme une "espèce" de variable globale gérée dans l'espace mémoire utilisateur (sous Windows). Une sémaphore ou un mutex est géré et stocké dans le noyau.

    C'est aussi pour cela qu'un mutex ou un sémaphore peut être utilisé entre 2 process différents du moment que l'on puisse identifier le mutex ou le sémaphore (par son nom sous Windows ou un nombre sous Unix) car il est stocké dans le noyau.

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

Discussions similaires

  1. Création de mutex ou section critique associés à une STD::LIST
    Par lika_lika dans le forum Threads & Processus
    Réponses: 0
    Dernier message: 05/11/2010, 18h23
  2. Threading Building Blocks (TBB), section critique et mutex
    Par simong dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 01/07/2010, 19h38
  3. quelle est la différence entre les sections critiques et les mutex ?
    Par blueLight dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 28/05/2010, 23h33
  4. [D7][IPC]Section critique ou Mutex ?
    Par jbat dans le forum Delphi
    Réponses: 5
    Dernier message: 28/06/2007, 22h49
  5. [synchro] Mutex VS Section Critique
    Par ZaaN dans le forum Visual C++
    Réponses: 1
    Dernier message: 15/06/2007, 13h43

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