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 :

Objets thread safe en C++


Sujet :

Threads & Processus C++

  1. #1
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut Objets thread safe en C++
    En faisant une recherche vite faite sur internet j'ai trouvé ces deux articles très intéressent :
    http://the-lazy-programmer.com/blog/?p=39 utilisant boost
    http://www.codeproject.com/KB/threads/xylock.aspx utilisant un minimum de l'api Windows

    Je me demande qu'elle est la meilleur approche pour rendre un objet C++ Thread Safe :
    - Poser un lock dans le début des codes que l'on désir marquer non réentrable.
    - "Locker" totalement un objet ou une variable. (Premier article avec boost)
    - Lever une exception lors d'un accès à un objet par un Thread autre que celui qui l'a crée. (DotNet)
    - Je vais pas mentir et marquer un "etc." car franchement ces trois que je connais actuellement et ce poste est là pour m'aider à élargir mes horizons concernant le sujet.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 148
    Points
    148
    Par défaut
    A partir du moment ou tu lock, tu perds tout l'intérêt du multi thread.
    Il est donc complètement inutile de faire plusieurs thread car les lock (semaphores) sont très lent et donc tu perds en performance par rapport a un système simple sans lock.

  3. #3
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Citation Envoyé par yamashi Voir le message
    A partir du moment ou tu lock, tu perds tout l'intérêt du multi thread.
    Il est donc complètement inutile de faire plusieurs thread car les lock (semaphores) sont très lent et donc tu perds en performance par rapport a un système simple sans lock.
    Je ne comprends pas ta réponse. Le multi thread n'est pas forcément là pour améliorer les performances mais pour permettre l'exécution concurrente de différents morceaux d'un programme : par exemple compiler un projet et garder l'I.H.M active.

    Citation Envoyé par emmr.rida Voir le message
    En faisant une recherche vite faite sur internet j'ai trouvé ces deux articles très intéressent :
    http://the-lazy-programmer.com/blog/?p=39 utilisant boost
    http://www.codeproject.com/KB/threads/xylock.aspx utilisant un minimum de l'api Windows

    Je me demande qu'elle est la meilleur approche pour rendre un objet C++ Thread Safe :
    - Poser un lock dans le début des codes que l'on désir marquer non réentrable.
    - "Locker" totalement un objet ou une variable. (Premier article avec boost)
    - Lever une exception lors d'un accès à un objet par un Thread autre que celui qui l'a crée. (DotNet)
    - Je vais pas mentir et marquer un "etc." car franchement ces trois que je connais actuellement et ce poste est là pour m'aider à élargir mes horizons concernant le sujet.
    Je ne sais pas quelle est la meilleure approche.
    Cependant, il me paraît pertinent de protéger totalement un objet qui va être partagé entre plusieurs threads. Cela évite de se poser la question de "Qu'est ce qui est protégé et qu'est ce qui ne l'est pas ?"

  4. #4
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Tout dépend du contexte.

    Pour un systeme simple, mais pas forcement performant, locker tout l'objet surement le plus efficace.

    Par contre, pour tirer profit des performances du multi-thread, il faut se poser un peu plus de questions, notamment :

    - combien de threads on besoin d'écrire dans l'objet ?
    - combien de threads on besoin de lire dans l'objet ?
    - est-ce que si un thread écrit dans un objet et qu'un thread essaie de lire en même temps, il est important que la lecture renvoi la nouvelle valeur ou est-ce que l'on peut renvoyer la valeur précédent l'écriture en cours ?

    La 3eme question, c'est notamment en cas d'un thread de calcul et d'un thread d'affichage qui tournent pendant un certain temps : si l'affichage n'est pas toujours parfaitement à jour, c'est pas forcement grave.

    En fonction des réponses à ces questions, il y a différentes solutions :

    - lockfree (peut être très efficace si on a un seul thread qui écrit et plusieurs qui lisent)
    - mutex
    - section critique
    ....

    Lockfree : plus d'infos ici : http://en.wikipedia.org/wiki/Lock-fr...ree_algorithms

    C'est u peu plus complexe a implémenter, c'est surtout pénible à tester, mais j'ai déjà obtenu des gains de performances significatifs.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Tout dépend de ce que fait ton objet... Le but étant de le rendre thread-safe, il est crucial de comprendre en quoi certaines méthodes / accesseurs ne le sont PAS.

    Si l'objet est partagé entre plusieurs threads, il faut voir quelles sont les conditions d'interblocage et/ou de retours erronés en priorité.
    Blinder à outrance de mutex ne sert en général à rien, sauf à ralentir tout ce qui utilise cet objet. Il faut en mettre dans 99% des cas (il est rare qu'une classe soit totalement réentrante de partout, ou alors, elle n'est que consultative !), mais parfois, ce sont des choses très simples comme un InterlockedIncrement qui suffisent... Dans d'autres cas, il te faudra utiliser des mutex nommés inter-processus.

    Les causes principales de non-réentrance :
    • Utilisation d'autres éléments que les paramètres passés à la méthode (attributs R/W, globales, etc...).
    • Accès concurrent en écriture et lecture, la valeur lue/écrite ayant un impact crucial.
    • Utilisation de ressources critiques non partageables (ex : sockets, certains handles, ports I/O et accès bas niveau, etc.).
    • Méthode modifiant l'état de l'objet.
    • Écriture de méthodes / classes singleton.
    • etc.


    Par contre, ces éléments garantissent une réentrance complète :
    • Méthode n'utilisant absolument que ses propres paramètres, et aucun élément global (inclus les variables locales déclarées en "static").
    • Élément ne pouvant être que lu, initialisé par exemple dans le constructeur et jamais modifié par la suite.
    • De façon globale, éléments utilisés d'une seule et unique manière par tous les threads et dont la valeur / état réel n'impacte pas le fonctionnement des autres éléments.


    Bref, la liste des problèmes de réentrance est vaste, voire infinie. Il est crucial que tu comprennes bien le concept d'atomicité, et de voir quelles sont les opérations qui doivent être atomiques, afin de pouvoir les protéger efficacement.

    De façon générale, il faut limiter au maximum possible le code en section critique et penser toujours au pire des cas, notamment et surtout le fait que sauf mention contraire, aucune instruction du C/C++ n'est garantie comme atomique. Y compris des trucs "simples" comme un "i++" ou un "m=0"....

    Enfin, un mutex ne prends pas forcément beaucoup de temps à gérer, tout dépend en fait de QUEL type de mutex tu te sers... Une fonction "Interlocked*" ne provoque aucun overhead habituellement, c'est juste un "raccourci" pour une instruction processeur particulière (qui est, elle, atomique) et qui n'aurait peut-être pas été utilisée par ton compilateur si tu t'étais contenté d'un simple "++". Tout dépend de ton but final : rendre ton objet "juste" thread-safe (et risquer le clash en interprocessus), ou le rendre directement process-safe, sachant que ce sera sûrement un bulldozer pour soulever une miette si ta classe n'est JAMAIS destinée à être utilisée en environnement multi-processus. Il faut choisir judicieusement le niveau de protection que l'on souhaite avoir.

    De façon générale, plus un mutex est global au système (ex : un CreateMutex inter-processus par rapport à un CRITICAL_SECTION) et plus il est complexe (ex : mutex lecteurs/rédacteur par rapport à un "simple" mutex de section critique), plus il est lent et coûteux à utiliser.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par yamashi Voir le message
    A partir du moment ou tu lock, tu perds tout l'intérêt du multi thread.
    Il est donc complètement inutile de faire plusieurs thread car les lock (semaphores) sont très lent et donc tu perds en performance par rapport a un système simple sans lock.
    Ok, mais des l'instant ou tu as un code multi-threadé, tu te retrouve forcement avec des problématiques de ressources partagées,
    le problèmes de ces ressources partagées est justement qu'elles font parties des section critiques et doivent être protégées (d'où les lock).


    Exemple bête: Tu as un serveur multi-threadé et tu veux compter le nombre de transactions que ton serveur effectue. si tu ne protège pas ce compteur au moins en écriture tu va te retrouvé avec des valeurs débiles dès que deux thread s'amusent à incrémenter ce compteur en même temps.

    Et pour ne pas te retrouver avec des valeurs coconne tu n'as que deux solution:
    - le protéger avec des lock (sémaphore/mutex ou équivalent)
    - le déclarer comme volatile (ce qui veux dire qu'il n'ira jamais se mettre dans les registres de ton processeur, mais que cela le protegera contre une double écriture)


    pour moi le multi-thread ne peux pas être envisagé sans se poser des questions sur les sections critiques ou alors c'est que tes threads font des trucs totalement différents et pourrait a la limite être dans des applications séparées.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  7. #7
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Ok, mais des l'instant ou tu as un code multi-threadé, tu te retrouve forcement avec des problématiques de ressources partagées,
    le problèmes de ces ressources partagées est justement qu'elles font parties des section critiques et doivent être protégées (d'où les lock).


    Exemple bête: Tu as un serveur multi-threadé et tu veux compter le nombre de transactions que ton serveur effectue. si tu ne protège pas ce compteur au moins en écriture tu va te retrouvé avec des valeurs débiles dès que deux thread s'amusent à incrémenter ce compteur en même temps.

    Et pour ne pas te retrouver avec des valeurs coconne tu n'as que deux solution:
    - le protéger avec des lock (sémaphore/mutex ou équivalent)
    - le déclarer comme volatile (ce qui veux dire qu'il n'ira jamais se mettre dans les registres de ton processeur, mais que cela le protegera contre une double écriture)


    pour moi le multi-thread ne peux pas être envisagé sans se poser des questions sur les sections critiques ou alors c'est que tes threads font des trucs totalement différents et pourrait a la limite être dans des applications séparées.
    le tout est donc d'identifier les sections critique correctement pour ne pas dégrader les perfs.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  8. #8
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    - le déclarer comme volatile (ce qui veux dire qu'il n'ira jamais se mettre dans les registres de ton processeur, mais que cela le protegera contre une double écriture)
    Déclarer comme "volatile" assure l'accès concurrentiel ?

    Ca m'etonne.

    Certes, cela garantit que la données ne sera pas stockée dans un registre du processeur.

    Donc un thread ne peut pas stocker une valeur dans un registre et travailler dessus pendant qu'un autre thread charge une valeur différente dans un registre.... etc...

    Mais la donnée est stockée en mémoire, il est donc important d'en protéger l'écriture si plusieurs threads sont susceptibles d'y écrire en même temps.

    Surtout sur un processeur multi-cœurs : ils ont plusieurs jeux de registres (1 par cœur) mais aussi plusieurs bus pour accéder à la mémoire ou au cache, et rien ne garantit que deux threads sur deux cœurs différents ne s'exécutent pas STRICTEMENT au même moment et écrivent dans la même zone mémoire, STRICTEMENT au même moment.

    Volatile permet seulement, il me semble, d'assurer la cohérence en LECTURE :

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (i=0; i<n ; i++)
    {
       traiter(m_valeur);
    }
    Ici :
    - si pendant la boucle un autre thread vient écrire dans le membre "m_valeur" pendant l'exécution de la boucle
    - si la variable "m_valeur" a été stockée dans un registre par le compilo le temps de la boucle (pour optimiser)

    Alors "m_valeur" ne sera pas mis à jour, et le traitement se fera toujours sur la valeur de départ.

    Mais en ce qui concerne l'ecriture, il me semble que ça ne garantit rien. La seule solution, c'est le "test and swap"

    Encore plus vrai sur un multi-coeur.

  9. #9
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Pardon, ce n'est pas "test and swap", mais bien "compare and swap"

    Plus d'infos ici :

    http://en.wikipedia.org/wiki/Compare-and-swap

    Il s'agit pratiquement de LA SEULE opération du processeur (multi-coeur ou pas) qui soit garantie comme atomique.

    Toutes les API de haut niveau (mutex, lock, spin-lock...) sont basées dessus.

    C'est aussi ce qui permet de faire du "lock-free".

    La lecture de cet article wikipedia et de l'article que j'ai donné précédemment permettent de comprendre beaucoup de choses sur comment ça fonctionne.

  10. #10
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    volatile indique simplement au compilo que la variable peut changer sans raison apparente. Donc il n'y a pas d'optimisation sur cette variable en la gardant dans un registre. Elle est récupérée à chaque fois en mémoire. Donc, comme dit précédemment volatile ne garantie rien contre les problèmes d'accès concurrent.

  11. #11
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Le modificateur "volatile" ne garantit absolument rien côté thread-safe, il garantit uniquement que la donnée sera systématiquement rechargée depuis son adresse et non pas maintenue dans un registre.

    Cela sert (presque) exclusivement à mapper un port I/O afin de garantir qu'il y aura bel et bien toujours un accès I/O effectué et non pas l'utilisation d'une vieille valeur désormais incorrecte.

    En dehors de la programmation système, cela ne sert presque que si tu as un attribut possédant un accesseur en écriture et AUCUN accesseur en lecture, ce qui te garantit alors que l'attribut sera bien toujours lu et sera cohérent s'il y a eu une écriture entre temps.

    Toutefois, l'utilisation de "volatile" peut avoir un impact négatif assez lourd sur le code, car il y a alors de fortes chances que le cache soit plus ou moins inutilisé dessus, provoquant des accès mémoire "lents".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  12. #12
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Cela sert (presque) exclusivement à mapper un port I/O afin de garantir qu'il y aura bel et bien toujours un accès I/O effectué et non pas l'utilisation d'une vieille valeur désormais incorrecte.
    Cela sert aussi pour une variable utilisée à la fois par une interruption (ou un signal) et par le programme principal
    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
    .

  13. #13
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    volatile indique simplement au compilo que la variable peut changer sans raison apparente. Donc il n'y a pas d'optimisation sur cette variable en la gardant dans un registre. Elle est récupérée à chaque fois en mémoire. Donc, comme dit précédemment volatile ne garantie rien contre les problèmes d'accès concurrent.
    effectivement je me suis un peu trompé de scope pour le le volatile, ça interviens plus dans du multi-tache que dans du multi-thread.....


    Ceci pour savoir un peu les cas d'utilisation de volatile:
    http://publications.gbdirect.co.uk/c..._volatile.html
    http://embedded.over-blog.com/article-4590386.html

    dès fois je parle trop vite....
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  14. #14
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Ok, mais des l'instant ou tu as un code multi-threadé, tu te retrouve forcement avec des problématiques de ressources partagées,
    le problèmes de ces ressources partagées est justement qu'elles font parties des section critiques et doivent être protégées (d'où les lock).


    Exemple bête: Tu as un serveur multi-threadé et tu veux compter le nombre de transactions que ton serveur effectue. si tu ne protège pas ce compteur au moins en écriture tu va te retrouvé avec des valeurs débiles dès que deux thread s'amusent à incrémenter ce compteur en même temps.
    Confie le comptage à un seul thread et poste lui des notifications d'incrémentation dans une file lock-free. => 0 lock
    (je n'ai pas dis que c'était efficace dans ce cas, mieux vaut utiliser ici un simple compteur atomique).

    Les zones partagées sont des zones de troubles. A chaque fois que l'on peut éviter cela, on s'y retrouve.

    PS: je ne peux que conseiller la lecture des articles d'Herb Sutter sur le DDJ. Le MT est son dada en ce moment.
    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...

  15. #15
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Confie le comptage à un seul thread et poste lui des notifications d'incrémentation dans une file lock-free. => 0 lock
    (je n'ai pas dis que c'était efficace dans ce cas, mieux vaut utiliser ici un simple compteur atomique).

    Les zones partagées sont des zones de troubles. A chaque fois que l'on peut éviter cela, on s'y retrouve.

    PS: je ne peux que conseiller la lecture des articles d'Herb Sutter sur le DDJ. Le MT est son dada en ce moment.
    Effectivement les articles ont l'air intéressants. je vais probablement les regarder de près car je suis sur ce genre de problèmes en ce moment.

    Perso j'essaye d'éviter d'avoir des zones partagées, mais parfois il n'y a pas le choix.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 148
    Points
    148
    Par défaut
    Je ne comprends pas ta réponse. Le multi thread n'est pas forcément là pour améliorer les performances mais pour permettre l'exécution concurrente de différents morceaux d'un programme : par exemple compiler un projet et garder l'I.H.M active.
    Dans ce cas il est inutile de lock, si chaque thread a une tache spécifique et n'accède/modifie pas la mémoire des autres.
    Dans la question du PO je pense qu'il veut traiter la même chose mais de façon parallèle.
    Exemple : Parser une liste ou un vecteur.
    Or si il doit lock a chaque accès au conteneur, l'accès sera 20 fois plus lent (prouver et vérifier par des tonnes de Benchmark).
    Donc pour gérer ce problème sans le problème de lock, je découperais la liste en n liste (n étant le nombre de thread a utiliser) pour faire ce que je veux avec les données sans avoir besoin de lock.

    Une application pleine de lock est une application mal pense, coder sur 1 thread n'est pas pareil que sur 2 ou plus, il faut penser différemment et non pas faire la même chose que sur le thread unique mais en mettant des lock partout !

    Apres je ne connais pas son problème, mais les conteneur thread safe sont déjà un mauvais départ. Avant de vous soucier des zone critique, souciez vous de concevoir votre application de tel façon qu'il n'y en ai pas !

  17. #17
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Cela sert aussi pour une variable utilisée à la fois par une interruption (ou un signal) et par le programme principal
    J'avais bien mis "(presque)"...

    Toutefois, pour ma part, quand on commence à jouer avec les IT et les signaux, on approche significativement de la programmation système et non plus de la programmation applicative. En programmation applicative, "volatile" devrait être aussi peu utilisé que "register", c'est à dire "jamais" de préférence.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Objet JDBC Connection thread-safe ?
    Par dedz dans le forum JDBC
    Réponses: 1
    Dernier message: 24/11/2008, 13h45
  2. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  3. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  4. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  5. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21

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