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

 C++ Discussion :

comment marche les mutex au niveau de la RAM


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut comment marche les mutex au niveau de la RAM
    Bonjour à tous,

    voila si j'ai 2 thread qui ont besoin d'une meme ressource. Le premier thread exécute l'instruction
    il va donc lire un attribut de l'objet de la class std::mutex, et si l'attribut n'est pas verrouillé par le second thread, alors le premier thread va mettre un attribut à True en modifiant dans la RAM la valeur d'un attribut pour verrouiller le mutex. Si le second thread tombe sur l'instruction :
    le second thread devra attendre (car instruction bloquante) que le premier thread déverrouille le mutex pour pouvoir acceder à la ressource. C'est le comportement normale que l'on souhaite avoir.

    Mais est ce possible qu'on arrive dans le cas ou le premier thread voit que le mutex n'est pas verrouillé, le verrouille, mais qu'en parallèle le second thread était en train d'écrire dans la RAM pour mettre l'attribut à verrouiller, et on serait dans le cas ou les 2 threads on accès à la meme ressource mémoire ?

    Merci d'avance pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Non, si un mutex est a subit une instruction "lock", toute fonction qui essayerait d'utiliser lock sur le mutex se verrait "block".

    Et la première arrivée est la première servie :en interne, la vérification est définie pour être "atomique" : il n'y a absolument pas moyen que "quelque chose" vienne "poser la question" alors que l'on est déjà occupé à y répondre pour "quelque chose d'autre".
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Tu poses en effet une bonne question. Si un mutex n'était fait que de simples accès mémoire "je teste puis j'écris", ça ne pourrait pas fonctionner.
    On a besoin dans ce cas d'utiliser une capacité spéciale du processeur. On a besoin par exemple :
    - instruction "test and set". C'est une instruction assembleur garantie atomique qui va tester puis écrire en garantissant qu'entre ces étapes qu'aucun processeur, ni aucune interruption n'agira entre les deux.
    - "swap atomique". Une adresse mémoire est lue et remplacée de manière atomique.
    - d'autres accès garantis atomiques comme le "read then write".
    Pour la plupart des processeurs Intel, il existe une ribambelle de moyens. Pour les processeurs RISC il n'y a souvent qu'une unique instruction insécable.

    Pour se protéger des interruptions concurrentes en environnement multiprocesseur, c'est un peu plus complexe on doit utiliser un mécanisme actif appelé "spin lock" (si une interruption en a bloquée une autre, quand elle se termine elle peut devoir réveiller un autre processeur.)

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    merci beaucoup dalfab pour ta réponse tres complete !

    j'ai regardé un peu sur le net pour l'instruction Test and set en assembleur, mais pas moyen de trouver la commande qui réalise cela. On est d'accord que l'instruction test and set est réalisé par une commande en assembleur comme add, jump, cmp, move ...

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    De mémoire, le test and set je l'ai utilisé par les processeurs d'origine motorola, il doit être dans le processeur PowerPC.
    Le swap je l'ai utilisé sur processeur ARM.

    Je viens de voir l'article wikipedia https://fr.wikipedia.org/wiki/Test-and-set qui dit une belle connerie (on ne peut l'écrire comme ça en C)

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    ok merci pour les infos

    et oui effectivement j'avais vu tout a l'heure l'exemple de wiki qui est archi faux

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 453
    Points : 43 108
    Points
    43 108
    Par défaut
    De mémoire, le test and set je l'ai utilisé par les processeurs d'origine motorola, il doit être dans le processeur PowerPC.
    Le swap je l'ai utilisé sur processeur ARM.
    Sur x86, en assembleur, il y a l'instruction BTS pouvant être préfixée par LOCK pour être atomique dans un environnement multi-processeurs.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  8. #8
    Membre régulier Avatar de ekieki
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 103
    Points
    103
    Par défaut
    Sur powerpc, il y a la notion de réservation.

    Exemple de code pour incrémenter un entier de façon atomique. Quand on fait le lwarx, ça charge un entier en
    notant dans un registre (unique au processeur) l'adresse du truc dont on veut se réserver l'accès.

    L'écriture conditionnelle stwcx vérifie que l'entier qu'on veut modifier est bien celui qui est réservé. Sinon c'est que quelqu'un nous a chipé la réservation, alors on recommence.
    La probabilité étant très faible, c'est un moyen peu pénalisant.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    retry:
      lwarx  r4, 0, r3 // Read integer from RAM into r4, placing reservation.
      addi   r4, r4, 1 // Add 1 to r4.
      stwcx. r4, 0, r3 // Attempt to store incremented value back to RAM.
      bne-   retry     // If the store failed (unlikely), retry.
    voir https://www.ibm.com/developerworks/l...tom/index.html

  9. #9
    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
    Citation Envoyé par dalfab Voir le message
    Je viens de voir l'article wikipedia https://fr.wikipedia.org/wiki/Test-and-set qui dit une belle connerie (on ne peut l'écrire comme ça en C)
    En effet, ça donne un beau contraste avec la page anglophone, où le même code contient ce commentaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        // -- Start of atomic segment --
        // This should be interpreted as pseudocode for illustrative purposes only.
        // Traditional compilation of this code will not guarantee atomicity, the
        // use of shared memory (i.e., non-cached values), protection from compiler
        // optimizations, or other required properties.
    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.

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

Discussions similaires

  1. [RegEx] Problème simple pour comprendre comment marche les regex
    Par Fabious dans le forum Langage
    Réponses: 3
    Dernier message: 11/05/2011, 13h39
  2. Comment marche les CB
    Par bourvil dans le forum La taverne du Club : Humour et divers
    Réponses: 21
    Dernier message: 02/05/2011, 16h34
  3. [Data] Comment marche les transactions dans spring?
    Par mcfly37 dans le forum Spring
    Réponses: 7
    Dernier message: 09/07/2010, 13h58
  4. wxWidget comment marche les scrollbar
    Par jonny_the_dog dans le forum wxWidgets
    Réponses: 1
    Dernier message: 16/10/2006, 09h25
  5. Comment marche les Skybox?
    Par wystan dans le forum OpenGL
    Réponses: 6
    Dernier message: 17/07/2006, 13h40

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