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 :

les bases threading


Sujet :

C++

  1. #21
    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 camboui Voir le message
    J'ai trouvé ce code qui semble le permettre
    C'est une usine à gaz ce code, au lieu de créer une section citique utilisée par les readers et les writers, on créé 3 événements.

    Effectivement tous les readers peuvent lire simultanément. Ceci dit, le temps de lock/unlock d'une section critique est très très rapide (beaucoup plus qu'un Event et son appel WaitForSingleEvent).
    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
    .

  2. #22
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Ca peut quand même être intéressant si tu as beaucoup d'accès en lecture en même temps et que les temps de lectures sont longs (on parle de threads ici, mais l'idée pourrait être transposés aux bases de données par exemple)
    Par contre, je trouve aussi que ça fait un peu usine à gaz, j'aurais plus vu une approche similaire à un shared_ptr (qui nous fait un proposal pour un shared_lock ? ) Sinon, peut être avec les condition_variable ou les adopt_lock ?

  3. #23
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Juste histoire de rajouter mon petit grain de sel : il y a deux aspects importants dans un accès atomique à une donnée. Le premier est bien évidemment l'accès lui-même, qui doit être non interruptible par un autre accès à la même donnée. Le second point est plus obscur, et concerne directement le fonctionnement des microprocesseurs actuels : en pus d'accéder à une variable de manière atomique, il faut aussi faire en sorte que cette variable soit récupérée/partagée depuis/vers les autres threads.

    Je vous encourage à lire (shameless plug, désolé) mon billet sur le sujet. je vous le concède, c'est abscons.

    Ceci dit, on en déduit quelques petites choses intéressantes :

    Citation Envoyé par Neckara Voir le message
    Bonjour,

    Seulement si l'opération effectuée n'est pas atomique (ie se faisant en une seule opération).

    On peut par exemple regarder la valeur d'une variable booléenne/d'un char/short/int ou lui affecter une valeur sans nécessairement passer par une section critique.
    Si si, c'est obligatoire - pour au moins une bonne raison : la section critique va implémenter les barrières mémoires nécessaires à ce que la variable soit vue correctement. Si la variable est dans le cache processeur en version non modifiée, un code sans barrière mémoire va récupérer la version dans le cache, et non pas la version mise à jour dans la mémoire centrale. A noter que le mot-clef volatile ne changera rien à cela : il n'ajoute pas de barrière mémoire à lui seul.

    Du coup, et contrairement à la croyance générale, la lecture d'un int, bool, char, float... n'est PAS atomique (puisqu'une mise à jour du cache peut avoir lieu).

    La réponse vaut aussi pour les commentaires suivants :

    Citation Envoyé par Neckara Voir le message
    Mieux vaut faire : (passed_struct->entier)++; l'incrémentation pouvant être atomique selon le type de entier.
    (l'incrémentation n'est pas atomique : il y a lecture + incrémentation + écriture de la donnée ; le processeur ne sait pas incrémenter la valeur d'une zone mémoire directement, même si l'instruction assembleur le fait croire ; de plus, inc n'ajoute pas de barrière mémoire, donc la lecture pourrait ne pas se baser sur la bonne valeur, et l'écriture pourrait ne pas être visible par les autres threads ; une barrière mémoire d'acquisition et une de libération sont nécessaires).

    Citation Envoyé par camboui Voir le message
    Permettez-moi de n'incruster...

    La section critique n'est utile qu'en écriture, pas en lecture, n'est-ce pas ?
    Tous les threads peuvent accéder simultanément en lecture à une resource.
    Mais alors comment:
    -lorsqu'un thread veut accéder en écriture, bloquer tous les autres threads ?
    -lorsqu'un thread veut accéder en lecture, ne bloquer que ceux qui veulent accéder en écriture ?
    merci.
    (Idem, une section critique n'est pas qu'un accès atomique à une variable)

    Citation Envoyé par camboui Voir le message
    Tant qu'il n'y a pas de demande d'écriture, comment ne pas bloquer les lectures afin qu'elles puissent avoir lieu simultanément, tout en les bloquant lorsqu'il y aura une écriture ? (blocage seulement dans ce cas précis)
    Une technique possible est d'utiliser un mécanisme qui s'appelle RCU - Read/Copy/Update. En gros, histoire de simplifier l'explication :

    * un code qui a besoin de lire la donnée demander au système RCU son déréférencement. Dès qu'il a fini, il prévient le système RCU.
    * une code qui a besoin d'écrire la donnée prévient le système RCU, qui lui donne une copie de la donnée. Le code écrit la donnée, et la libère. Le système met la donnée dans un cache.
    * toute demander ultérieur de la donnée permet de récupérer la nouvelle valeur.
    * dès que toutes les demandes de lecture antérieures au changement sont terminée, le système RCU fait un swap atomique (avec les barrières mémoire qui vont bien) de la donnée.

    Il existe une implémentation userspace de RCU sur Linux (cf. http://git.lttng.org/?p=userspace-rcu.git). Il semblerait qu'elle ait été testée avec cygwin (donc sous Windows) mais je n'ai pas le statut de ce test. Si la compilation se passe bien, on devrait pouvoir obtenir une DLL qui serait alors utilisable par d'autres compilateurs (par exemple Visual C++). Ceci dit, la DLL en question se traînera une dépendance sur les DLL cygwin.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #24
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Est-ce que vous pourriez, vous ainsi que ceux qui trouvent le code que j'ai posté "usine à gaz" (pour une poignée de lignes de code...), proposer un code alternatif et générique à ce code ?
    Perso, la protection d'une donnée atomique est un cas d'école. En général la ressource partagée à protéger est "lourde" (eg données sur disque).

Discussions similaires

  1. connaitre les bases qui existes
    Par nycagi dans le forum Administration
    Réponses: 13
    Dernier message: 08/06/2004, 13h29
  2. Les Bases de Données! tout un monde!!
    Par kikimnet dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/04/2004, 19h26
  3. Lister les bases
    Par Neuromancien2 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/01/2004, 10h12
  4. Réponses: 1
    Dernier message: 01/08/2002, 22h09

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