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 :

[synchronisation] worker threads


Sujet :

Visual C++

  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut [synchronisation] worker threads
    Hello,

    j aimerais savoir quel mecanisme choisir pour faire de la synronisation multithreading.


    En gros j ai besoin d'avoir un accès exclusif a une ressource utilisée pas deux worker threads differents.

    j ai deja fais un essais avec une section critique et un single lock et un autre essais avec un mutex et un single lock; mais je dois pas avoir tout compris.

    Dites moi juste les types et nombre d objets a utiliser, je me debrouillerai pour implementer.

    ex : 1 single lock different par thread + 1 section critique commune.


    j aimerais vraiment la reponse de qqn qui a deja realisé correctement ce genre de synchro avec les MFC
    Pour les details, cherche tout seul !

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 75
    Points : 76
    Points
    76
    Par défaut
    Les sections critiques et les mutex fonctionnent de la même façon. La seule différence entre les 2 est qu'un mutex est également visible d'un autre programme (utile si plusieurs soft accèdent à la même ressource).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define TPSMAX 10000
    CCriticalSection sc;
     
    // dans le thread 1 :
    sc.Lock(TPSMAX);
    // accès aux ressources partagées
    sc.Unlock()
     
    // dans le thread 2 :
    sc.Lock(TPSMAX);
    // accès aux ressources partagées
    sc.Unlock()

  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 519
    Points
    41 519
    Par défaut
    De plus, sous MFC, on peut utiliser la classe CSingleLock qui appelle automatiquement Unlock() dans son destructeur.
    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.

  4. #4
    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
    Citation Envoyé par SERTNM
    Les sections critiques et les mutex fonctionnent de la même façon. La seule différence entre les 2 est qu'un mutex est également visible d'un autre programme (utile si plusieurs soft accèdent à la même ressource).
    Je ne suis pas certain mais je pensais qu'il y a avait une autre différence. Notamment que lorsque que l'on se trouve dans une section critique, le processeur n'est plus alloué pour une autre tâche (le multi-tache est temporairement stoppé, d'où l'importance de faire des opérations courtes dans les sections critiques) alors qu'avec l'utilisation de mutex, on conserve le multi-tache, à moins évidemment que toutes les autres tâches soient en attente de la même ressource.

    Dites moi si je me trompe?

    Nicolas

    Citation Envoyé par ZaaN
    En gros j ai besoin d'avoir un accès exclusif a une ressource utilisée pas deux worker threads differents.
    Une autre solution peut être d'implémenter un sémaphore à un jeton pour réaliser une mutex.

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui tu te trompes,
    avec un section critique un thread en train de protéger une portion de code pourra être préempté par le système pour planifié un ou plusieurs threads.
    les threads suspendus par EntercriticalSection et sur la même section critique ne seront pas planifiés.
    donc un thread préempté pendant un section critique est assuré que le système ne donnera pas la main a un autre thread voulant utiliser la même section critique.
    la différence avec le mutex c'est que celui ci repose sur un objet global du système alors que la section critique sur un objet global du processus.
    le mutex permet alors effectivement l'utilisation entre plusieurs processus.

  6. #6
    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
    Ok, c'est clair!

    J'ai du confondre...Pour info, existe-il sous Windows, une fonction qui permette justement de suspendre toute préemption pour l'éxécution unique d'un code dans une section?

    Sans forcément avoir besoin d'utiliser un thread avec la priorité THREAD_PRIORITY_TIME_CRITICAL, chose que je n'ai jamais essayé mais, à ce que j'ai compris, doit nécessairement se terminer pour redonner la main à d'autres threads.

    Sous VxWOrks( qui est par contre un RTOS), j'ai le souvenir d'avoir utilisé des fonctions permettant justement d'interdire la préemption pour éxécuter un bout de code spécifique.

  7. #7
    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 519
    Points
    41 519
    Par défaut
    Rien ne peut empêcher la préemption sous Windows, sauf peut-être mettre un thread en THREAD_PRIORITY_TIME_CRITICAL dans un process en REALTIM_PRIORITY_CLASS.
    Cela donnera la priorité absolument maximale au thread, mais s'il y a un autre thread qui s'exécute avec la même priorité, il y aura toujours partage de temps...
    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. Question sur la synchronisation des threads.
    Par sebastieng dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 07/12/2005, 15h55
  2. Comment suspendre un worker thread?
    Par Mastero dans le forum MFC
    Réponses: 8
    Dernier message: 08/07/2005, 13h06
  3. Réponses: 1
    Dernier message: 23/05/2005, 15h52
  4. Synchronisation de thread
    Par declencher dans le forum Langage
    Réponses: 2
    Dernier message: 07/01/2004, 10h28

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