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 :

demande de pr�cision sur le mot-clef volatile


Sujet :

Threads & Processus C++

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    4
    D�tails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par d�faut demande de pr�cision sur le mot-clef volatile
    Bonjour
    J'ai un programme avec 2 threads sur une architecture classique 32 bits , et j'ai des variables de type simple (int) � prot�ger � la fois d'un acc�s concurrent �criture/�criture, et d'un acc�s concurrent lecture/�criture.

    Le mot clef volatile me prot�ge contre un acc�s �criture/�criture.
    Mais je ne sais pas si il prot�ge aussi un acc�s concurrent lecture/�criture.
    Quelqu'un aurait-il la r�ponse ? (un thread peut-il lire la valeur d'une variable au m�me moment ou un autre est en train de la modifier, et lire alors une valeur �rron�e, ou lira-t-il forc�ment soit la valeur juste avant la modification, soit la valeur juste apr�s ?)

    Merci d'avance

  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 : 62
    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
    Par d�faut
    Le mot cl� volatile indique uniquement au compilateur � ne pas faire de simplification sur la lecture. Il indique que cette variable peut �tre modifi�e de mani�re externe.

    Exemple avec le code suivant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    int val = 1;
    while(val == 1)
    {
    }
    Le compilateur pourrait tr�s bien simplifier en ignorant la variable val et en �crivant quelque chose comme cela (puisque val n'est pas utilis�) :
    Le fait de mettre le mot cl� "volatile" indique au compilateur qu'il ne doit pas faire de simplifications.

    Le mot cl� volatile trouve son utilit� dans le cas d'une variable du programme dont la valeur peut �tre modifi�e par une interruption (donc hors contexte du programme).
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    4
    D�tails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par d�faut
    Merci,
    Mais �a ne r�pond pas � ma question

    En fait je devrais sans doute reformuler :

    Sur une architecture classique, 32 bits, avec 2 processeurs (pr�cision qui a son importance)
    - un premier thread va effectuer une op�ration d'assembleur pour lire un emplacement m�moire de 4 octets.
    - un deuxi�me thread va effectuer une op�ration d'assembleur pour �crire dans ce m�me emplacement m�moire.

    la valeur lue par le premier thread pourra-t-elle �tre incoh�rente, ou sera-t-elle forc�ment soit une valeur pr�sente avant l'�criture du deuxi�me thread, soit une valeur pr�sente apr�s l'�criture du deuxi�me thread ?

    Merci 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 : 62
    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
    Par d�faut
    Citation Envoy� par archimondain Voir le message
    Mais �a ne r�pond pas � ma question
    Alors le titre du post n'est pas ad�quat

    Dans ton cas, il faudra passer par des op�rations de lectures/�critures atomiques.

    Je ne connais pas ton OS cible mais sous Windows, regarde du c�t� des Interlocked variable access

    Lu ici : Interlocked Variable Access
    Simple reads and writes to properly-aligned 32-bit variables are atomic operations. In other words, you will not end up with only one portion of the variable updated; all bits are updated in an atomic fashion. However, access is not guaranteed to be synchronized. If two threads are reading and writing from the same variable, you cannot determine if one thread will perform its read operation before the other performs its write operation.

    Simple reads and writes to properly aligned 64-bit variables are atomic on 64-bit Windows. Reads and writes to 64-bit values are not guaranteed to be atomic on 32-bit Windows. Reads and writes to variables of other sizes are not guaranteed to be atomic on any platform.
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  5. #5
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Comme le dit ram-0000, volatile ne garantie rien en terme de multithread. Si tu as un risque de race condition, il faut prot�ger. volatile dit juste que la variable peut changer hors du contexte de son utilisation imm�diate (les fameuses interruptions) et donc �viter certaines optimisations qui auraient pu avoir lieu par ailleurs.

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    4
    D�tails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par d�faut
    Merci pour vos r�ponses
    Effectivement j'aurai du poster ailleurs.
    Ce que je comprend c'est que volatile me garantis que mes op�rations lecture/ecriture s'effectuerons bien dans le m�me emplacement m�moire (et pas dans un registre ou autre optimisation du compilo).

    J'ai fait quelques tests, et sur une architecture 32 bits avec plusieurs processeurs, les op�rations de lecture/�criture sur 4 octets sont bien atomiques, et il ne semble pas y avoir de risque qu'un thread lise les 4 octets alors que l'autre a modifi� les deux premiers sans modifier les deux derniers.

    Quand il n'y a que des acc�s a des variables de type simple sur 4 octets � prot�ger (entier, float, pointeur), il semble donc superflue d'utiliser des mutex, le mot-clef volatile suffit.

  7. #7
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Citation Envoy� par archimondain Voir le message
    Merci pour vos r�ponses
    Effectivement j'aurai du poster ailleurs.
    Ce que je comprend c'est que volatile me garantis que mes op�rations lecture/ecriture s'effectuerons bien dans le m�me emplacement m�moire (et pas dans un registre ou autre optimisation du compilo).
    En fait, la valeur est lue en m�moire au moment de son utilisation (et non en cache) et que l'endroit o� a lieu cette lecture n'est pas modifi� par une optimisation.

    Citation Envoy� par archimondain Voir le message
    J'ai fait quelques tests, et sur une architecture 32 bits avec plusieurs processeurs, les op�rations de lecture/�criture sur 4 octets sont bien atomiques, et il ne semble pas y avoir de risque qu'un thread lise les 4 octets alors que l'autre a modifi� les deux premiers sans modifier les deux derniers.

    Quand il n'y a que des acc�s a des variables de type simple sur 4 octets � prot�ger (entier, float, pointeur), il semble donc superflue d'utiliser des mutex, le mot-clef volatile suffit.
    1 question :
    -> moi, je comprend que l'instruction d'�criture (ou de lecture) en m�moire est atomique : soit les 4 octets sont �cris (lus) soit il ne le sont pas. En revanche, l'op�ration de lecture/�criture en C++, elle n'est pas atomique. Ainsi (j'ai mis le code ASM de visual 9 en debug) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int retour;
    int var;
     
    retour = 0; //   --> atomique
    //   mov         dword ptr [retour],0   --> atomique
     
    retour = var_;   --> NON atomique
    //   mov         eax,dword ptr [var_]    --> lecture de 'var_' atomique
    //   mov         dword ptr [retour],eax    --> ecriture de 'retour' atomique
     
    retour = retour + 1; //   --> NON atomique
    //   mov         eax,dword ptr [retour]    --> lecture de 'retour' atomique
    //   add         eax,1  --> addition
    //   mov         dword ptr [retour],eax    --> ecriture du résultat dans 'retour' atomique
    Ce qui me laisse penser que tu n'es pas � l'abri de probl�mes en cas d'�critures simultan�es.
    1 remarque :
    -> d�s que tu changeras d'architecture/d'OS, ces hypoth�ses seront caduques et tu t'exposes � ce que le code ait un comportement erratique.

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    4
    D�tails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par d�faut
    merci pour cette pr�cision.

    c'est effectivement quelque chose � prendre en consid�ration.
    Dans mon cas tou se passe bien, car lors d'une affectation de type

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    volatile int shared_var;
    int value;
    shared_var = value;
    seule la variable qui re�oit l'affectation est partag�e par plusieurs thread, l'autre �tant propre � chaque thread.

    C'est vrai que mon code ne fonctione pas sur toutes les architectures, en revanche, il me paraitrait logique que l'atomicit� des op�rations ne d�pendent pas de l'OS. En tout cas j'ai test� sous linux et windows, et �a se passe bien dans les deux cas.

    De mani�re g�n�ral, je suis d'accord avec toi, et je crois qu'il vaut mieux �viter de s'appuyer sur un d�tail aussi bas niveau pour faire son programme.

    Mais dans mon cas j'ai de grosses contraintes de rapidit�, et le fait de ne pas utiliser de mutex augmente ma vitesse d'�xecution de facon directement proportionnel au nombre de processeurs dont je dispose, ce qui n'est pas du tout le cas quand j'utilise des mutex.

  9. #9
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Citation Envoy� par archimondain Voir le message
    Mais dans mon cas j'ai de grosses contraintes de rapidit�, et le fait de ne pas utiliser de mutex augmente ma vitesse d'�xecution de facon directement proportionnel au nombre de processeurs dont je dispose, ce qui n'est pas du tout le cas quand j'utilise des mutex.
    Effectivement, la synchronisation a un co�t. Mais, une des solutions est aussi de voir comment couper cette inter-d�pendance des 2 threads sur la m�me donn�e.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 23
    Par d�faut
    Je remonte un vieux sujet...

    Je voulais pr�ciser que pour qu'une op�ration de lecture ou d'�criture 32 bits soit atomique (sur un syst�me 32 bits),
    il faut que l'adresse de la lecture/�criture soit align�e (multiple de 4 octets).
    Dans le cas contraire, je pense que 2 op�rations seront r�alis�es.
    Connaissez-vous une directive C pour indiquer � une variable d'�tre align�e en m�moire ? (je crois savoir que cela est automatique pour les m�moires partag�es).

    Autre question, l'utilisation du mot clef 'volatile' indique t'il uniquement au compilateur de ne pas optimiser les acc�s en lecture / �criture � la variable ou indique t'il �galement de ne pas utiliser le cache ?
    L'utilisation ou non du cache a t-elle une cons�quence sur la communication inter-thread (ou inter-precessus) dans le cas d'un acc�s concurrent lecture/�criture ?

    Merci de vos r�ponses!

  11. #11
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    volatile n'apporte aucune garantie sur le plan MT.

    Si ta pr�occupation est li�e � des aspects MT, oublie volatile. D�finitivement -- sauf si tu utilises une mouture r�cente de VC++ (et VC++ seul -- et r�cent) qui a d�tourn� le mot cl�.
    Le C++11 apporte son lot de nouveaut�s qui solutionne les probl�mes que l'on voulait refiler � volatile.

    Sinon, lectures pour les sceptiques
    - http://www.alexonlinux.com/multithre...omic-variables
    - http://software.intel.com/en-us/blog...d-programming/

    Et un petit d�tournement:
    - http://drdobbs.com/cpp/184403766 (utilisation de volatile pour son c�t� cv-qualifier viral)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 23
    Par d�faut
    Salut,

    merci pour tes r�ponses.
    Je ne connaissais pas les fonctions atomiques __sync_fetch_and_xxx.
    Je ne peux malheureusement pas les utiliser avec ma version de gcc (3.4).

    D'apr�s ce que j'ai compris, le 'volatile' n'est pas utile si on utilise des mutex, ce que je fais actuellement.
    Le 'volatile' �tant plus rapide que le mutex, je vais essayer de le mettre en place pour certaines variables (par exemple celle que je scrute pour savoir si il faut terminer le thread).

  13. #13
    Membre �m�rite
    Avatar de Ekleog
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par d�faut
    Si une variable n'est acc�d�e en �criture que par un thread, alors volatile est � envisager ; � condition que les autres threads sachent que la valeur de la variable peut �tre modifi� m�me au cours d'une expression comme i + i.

    Ce qui peut g�ner parfois. En effet, assert(i+i == i*2), parfaitement valide en mono-thread, est potentiellement invalide en multithread, m�me si i est volatile.

    Mais d�s qu'une variable est acc�d�e en �criture par plusieurs threads, volatile est strictement inutile, m�me en connaissant les restrictions sus-cit�es.

  14. #14
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    VOLATILE NE GARANTIT RIEN D'UN POINT DE VUE MT


    Cf les articles propos�s par Luc entre autres. volatile est principalement utilis� pour acc�der � des registres mapp�s en m�moire et l� il est indispensable.

Discussions similaires

  1. mot clef volatile pr�cision
    Par guillaume07 dans le forum C++
    R�ponses: 26
    Dernier message: 18/12/2010, 09h09
  2. Demande de pr�cision sur clef �trang�re
    Par MistyMan dans le forum D�buter
    R�ponses: 2
    Dernier message: 06/11/2008, 01h21
  3. [final]demande d'explication sur ce mot-cl�
    Par Invit� dans le forum Langage
    R�ponses: 10
    Dernier message: 18/04/2006, 11h32
  4. Demande de pr�cision sur "Extends" ..
    Par Invit� dans le forum Langage
    R�ponses: 6
    Dernier message: 12/02/2006, 14h25
  5. Demande de pr�cisions sur Backup/Restore et transactions
    Par lio33 dans le forum Connexion aux bases de donn�es
    R�ponses: 1
    Dernier message: 16/11/2005, 12h08

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