1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    juin 2010
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : juin 2010
    Messages : 1 068
    Points : 1 733
    Points
    1 733

    Par défaut Atomicité d'une variable

    Salut les C, C++,

    je voulais savoir si une variable déclarer comme _Atomic est une variable contenant une valeur sachant que une opération atomique soit réussis soit échoue complètement.

    Ou si une variable déclarer comme _Atomic est plus une barrière mémorielle comme induit la glib ?

    Car mon lecteur de musique mmp (Micro Music Player) bug dès fois oui dès fois non quand on enclenche le mode shuffle.

    Sachant que le mode de lecture dépends de variables booléen ?

    Merci pour vos réponses éclairées,

    Luke Spywoker.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    5 029
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 5 029
    Points : 16 841
    Points
    16 841

    Par défaut

    Si j'ai bien compris la documentation, _Atomic est une caractéristique de la variable (ou du pointé), comme const ou volatile.
    J'en déduis qu'un _Atomic int contient un entier de la même manière qu'un int.

    J'imagine que je n'ai pas compris ta question.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre éprouvé Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    mai 2010
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : mai 2010
    Messages : 339
    Points : 1 159
    Points
    1 159

    Par défaut

    Bonsoir
    Citation Envoyé par ternel Voir le message
    Si j'ai bien compris la documentation, _Atomic est une caractéristique de la variable (ou du pointé), comme const ou volatile.
    J'en déduis qu'un _Atomic int contient un entier de la même manière qu'un int.

    J'imagine que je n'ai pas compris ta question.
    Non, pas tout à fait, c’est un équivalent exemple si l’on utilise _Atomic(int) x; on crée un spécificateur de formats en clair un nouveau type de variable atomique tant dit que si l’on fait ça _Atomic int x on crée juste une version atomique du nom de type int.

    Citation Envoyé par Luke spywoker Voir le message
    Salut les C, C++,

    je voulais savoir si une variable déclarer comme _Atomic est une variable contenant une valeur sachant que une opération atomique soit réussis soit échoue complètement.

    Ou si une variable déclarer comme _Atomic est plus une barrière mémorielle comme induit la glib ?

    Car mon lecteur de musique mmp (Micro Music Player) bug dès fois oui dès fois non quand on enclenche le mode shuffle.

    Sachant que le mode de lecture dépends de variables booléen ?

    Merci pour vos réponses éclairées,

    Luke Spywoker.
    Oui, une variable atomique est une variable qui peut contenir une valeur, quant à la question à savoir si une variable atomique est comme une barrière mémorielle comme celle; définis par glib je dirais probablement "oui, mais cela dépend de l’opération", mais dans ce cas elle joue le rôle d’un mutex ou sémaphore. À titre informatif la variable atomique est juste une variable qui est indissociable et définit une seule fois. Elle peut être modifiée par des processus/ou sous processus, mais dans l’ordre chronologique (ordre total) c’est-à-dire si un processus A agis sur la variable atomique X avant le processus B. Les modifications apportées seront d’ordre total (A et ensuite B). L’ensemble des fonctions ou type atomique dans votre lien liste juste et type atomique qui est associé au type de la glib quant aux fonctions, ce sont juste les opérations atomiques possible et réalisable qui sont définies pour permettre la synchronisation des accès. Donc et probablement pour ce qui est de barrière mémorielle, il me semble que cela s’applique dans un contexte d’accès d’espaces mémoire atomique un Fetch-and-add ou Test-and-set, mais à vérifier.

    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 607
    Points : 3 085
    Points
    3 085

    Par défaut

    Il faut distinguer 3 caractéristiques distinctes nécessaires si plusieurs threads accèdent à une même variable :
    * volatile : Les accès en lecture ou écriture doivent avoir une séquentialité garantie.
    * atomique : Des opérations sur la variable sont insécables. N'est possible que si le processeur sait le garantir, donc seuls quelques types sont potentiellement atomiques (p.e bit, octet, mot, ...)
    * barrières : Suite à une écriture, ou avant une lecture on a des garanties de ce qu'en voient les autres threads s'ils sont sur des processeurs différents. Car chaque processeur a une RAM cache et donc voit les écritures des variables modifiées ailleurs dans le désordre.
    Ces trois caractéristiques sont à distinguer en C et en C++ (d'autres langages comme C# ou Java regroupent sous le nom volatile une variable qui est à la fois volatile et tous ses accès sont atomiques et memory_order_seq_cst).
    Une atomique doit être volatile (pourquoi vouloir une action garantie garantie insécable si on ne la situe pas dans sa séquence).
    Les barrières n'ont de sens que sur des actions atomiques mais une action atomique peut être memory_order_relaxed et donc sans contrainte de barrière.
    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
    int a = 0;
    volatile int b = 1;
    atomic_int c = 0;
    void fct () {
      a = 3;
      b = 4;     // 'b' est volatile : on est sûr que LE thread fera a=3 avant b=4 et ensuite b--
                 // sans cela l'optimiseur pourrait directement écrire 3 dans 'b'
                 // les autres processeurs peuvent eux voir 'a' modifié après 'b'.
      b--;
      c++;       // 'c' est atomique, si 2 threads appellent fct() "en même temps" 'c' vaudra 2
                 // sans cela, les 2 c++ simultanés pourraient tous les 2 écrire 1 dans 'c'.
      atomic_store( &b , a );  // force un accès memory_order_seq_cst, TOUS les threads verront 'a' copié
                 // dans 'b' après c++ et avant a--;
                 // si on faisait b=a, le volatile ne garantirait ceci que pour LE thread.
      a--;
      atomic_store( &b , a , memory_order_release ); // les AUTRES thread qui lisent la valeur écrite ici dans 'b'
                 // sont sûr que le résultat a-- est écrit en RAM de tous les processeurs
                 // ici on ne garantit effectuées que les actions causes de 'b' (donc 'a' est en RAM)
    }
    L’utilisation d'objets de synchronisation (mutex, sémaphores, ...) permet aussi de gérer les "data races", ça protège des objets plus gros et ça inclut les 3 caractéristiques mais c'est plus lent et ne protège pas des interruptions.

  5. #5
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    juin 2010
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : juin 2010
    Messages : 1 068
    Points : 1 733
    Points
    1 733

    Par défaut

    Merci pour toutes ces réponses,

    Je pensais juste a déclarer mes 2 variables (de type bool) de contrôles pour le play-mode de mon lecteur audio.

    Car comme je disais dès fois il crash quand ont active le mode shuffle au mauvais moment rarement.

    ---

    Donc dans un contexte monothread bien que 2 timeout sont en route dans mon programme a vie...???

    Mais je pourrai très bien me servir du context de la GLib mainloop et/ou de sémaphores.

    ---

    Ma question était simplement:

    Est-ce que une variable atomique est une variable qui contient une valeur en plus de l'accès atomique.

    Ou est ce seulement une alternative aux sémaphores et aux variables de contrôles ?

    Merci pour vos réponses éclairées.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  6. #6
    Membre expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 607
    Points : 3 085
    Points
    3 085

    Par défaut

    Citation Envoyé par Luke spywoker Voir le message
    Est-ce que une variable atomique est une variable qui contient une valeur en plus de l'accès atomique.

    Ou est ce seulement une alternative aux sémaphores et aux variables de contrôles ?
    Une variable atomique c'est une variable, elle n'a rien de plus que ce que son type indique (donc un atomic_int c'est un int sans rien de plus). On peut l'écrire ou la lire. S'en servir peut permettre d'éviter une protection par sémaphores, par exemple en utilisant un atomic booléen comme un arbitre de double buffering, on aura un mécanisme qui pourra éviter des objets de synchro.
    C'est la manière d'utiliser la variable atomique qui va permettre de créer une protection, elle même n'a rien de "magique".

  7. #7
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    juin 2010
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : juin 2010
    Messages : 1 068
    Points : 1 733
    Points
    1 733

    Par défaut

    Merci pour cette réponse clair nette et précise.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  8. #8
    Expert éminent sénior

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    6 385
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 6 385
    Points : 12 710
    Points
    12 710

    Par défaut

    Citation Envoyé par Luke spywoker Voir le message
    Car comme je disais dès fois il crash quand ont active le mode shuffle au mauvais moment rarement.
    .
    l'atomicité d'une variable et le fait de la déclarer atomic,d'après ce que j'ai compris,c'est pour résoudre les problèmes de synchronisation.
    Donc si tu as des crashes c'est que tu fermes mal des objets il faudrait revoir ton code
    Ensuite dans un contexte monothread cela n'a pas d'intérêt car la variable en mémoire n'a de portée que dans le code dans lequel elle n'est utilisée c.a.d. qu'elle n'est pas modifiée par un autre processus (je ne sais pas si j'ai été clair là-dessus )
    Ne dites pas : "chercher la petite bête" mais plutôt "effectuer un travail d'entomologiste."
    Pour corriger des bugs c'est pareil

  9. #9
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    7 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 7 069
    Points : 22 362
    Points
    22 362

    Par défaut

    Citation Envoyé par Mat.M Voir le message
    l'atomicité d'une variable et le fait de la déclarer atomic,d'après ce que j'ai compris,c'est pour résoudre les problèmes de synchronisation.
    C'est vrai mais c'est une façon un peu rapide de résumer ça.

    « atomique » signifie en soi « indivisible », de la même façon qu'une « dichotomie » revient à couper quelque chose en deux (ça peut être quelque chose d'aussi concret qu'une plaquette de beurre mais en informatique, ça va typiquement concerner soit les conversions du décimal vers le binaire, soit une liste triée quand on veut y faire une recherche). Je suppose que tu le sais très bien mais pour être totalement exact, c'est pour cela aussi que les atomes de matière portent ce nom en physique et en chimie : c'est l'unité élémentaire en dessous de laquelle il n'est plus possible de diviser une quantité de matière donnée. Bon, on s'est aperçu qu'il est tout-à-fait possible de les casser mais alors, on dénature ladite matière et ce que l'on obtient est différent.

    L'atomicité en informatique concerne donc en général une opération quelconque : ici, il s'agit des accès à la mémoire mais dans le monde des bases de données, par exemple, c'est une des exigences du mécanismes des transactions, qui impliquent les fameuses propriétés ACID.

    Ensuite dans un contexte monothread cela n'a pas d'intérêt car la variable en mémoire n'a de portée que dans le code dans lequel elle n'est utilisée c.a.d. qu'elle n'est pas modifiée par un autre processus (je ne sais pas si j'ai été clair là-dessus )
    Même en contexte mono-thread, tu peux être confronté à ce problème, via les interruptions. Une IRQ peut très bien se déclencher en plein milieu d'une procédure censée être atomique et donc, par nature, être interrompue, ce qui en soi peut être un problème même si la routine appelée par l'IRQ ne modifie pas tes données. Ensuite, même si ce n'est pas un thread ou un processus concurrent qui accède à tes données, cela peut quand même concerner le matériel, via le DMA, spécialement si tu mets un sample en mémoire pour qu'il soit joué par la carton son ou si tu déposes une trame pour être émise sur le réseau via le contrôleur Ethernet ou autre. Maintenant, <stdatomic.h> ne couvre que les threads, donc…

    Tu peux également déclarer des segments de mémoire partagée, qui peuvent être exploités par d'autres processus, mais là encore, même remarque qu'au dessus.

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 13h45
  2. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 08h31
  3. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 11h25
  4. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 12h21
  5. Réponses: 4
    Dernier message: 05/06/2002, 15h35

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