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 :

[multithread] comment incrementer un compteur ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut [multithread] comment incrementer un compteur ?
    La question est simple, comment incrementer un compteur de facon thread safe ?

    Il y a bien sur la possibilité de sortir le grand jeu a coup de section critiques et/ou de mutex, mais le cout en performance est enorme pour simplement incrementer/decrementer un compteur.

    Faire des operation de ce type est possible en assembleur (operation atomiques). On voit ici que intel propose une solution pour C++ : http://www.hardware.fr/articles/687-...omne-2007.html

    Mais j'aimerais pouvoir compiler avec gcc, et que le tout marche pas qu'avec des processeurs intel . . .

    Et oui, les dual cores c'est de la saleté pour les programmeurs.

  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
    Citation Envoyé par deadalnix Voir le message
    La question est simple, comment incrementer un compteur de facon thread safe ?

    Il y a bien sur la possibilité de sortir le grand jeu a coup de section critiques et/ou de mutex, mais le cout en performance est enorme pour simplement incrementer/decrementer un compteur.

    Faire des operation de ce type est possible en assembleur (operation atomiques). On voit ici que intel propose une solution pour C++ : http://www.hardware.fr/articles/687-...omne-2007.html

    Mais j'aimerais pouvoir compiler avec gcc, et que le tout marche pas qu'avec des processeurs intel . . .

    Et oui, les dual cores c'est de la saleté pour les programmeurs.
    Si c'est un environnement Microsoft, la fonction InterlockedIncrement() est ton amie :-)

    http://msdn2.microsoft.com/en-us/library/ms683614.aspx

    Le fait que l'on soit mono core ou dual core n'est pas un problème. C'est le fait d'être multi thread qui ajoute une dimension supplémentaire à la complexité. Mais si c'était facile, on n'aurait plus besoin de développeurs :-)

    Raymond
    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
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Ah oui, merci pour cette reponse.

    Dans l'absolu, j'aimerais aussi pouvoir compiler cross plateforme . Le tout est un projet libre, ca serait quand meme dommage qu'il ne tourne que sous windows

    Cela dit, s'il y a une solution du meme type version posix, ca peut se gerer a coups de #define . Mais c'est fou ce que je galere a trouver la moindre doc sur le sujet.

    HS: je sais bien que le probleme vient du multithread, et pas des multicores en eux meme, mais je me met au multithread pour pouvoir profiter des multicores a 100% donc l'un dans l'autre, c'est quand meme de leur faute.

  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 deadalnix Voir le message
    Ah oui, merci pour cette reponse.

    Dans l'absolu, j'aimerais aussi pouvoir compiler cross plateforme . Le tout est un projet libre, ca serait quand meme dommage qu'il ne tourne que sous windows

    Cela dit, s'il y a une solution du meme type version posix, ca peut se gerer a coups de #define . Mais c'est fou ce que je galere a trouver la moindre doc sur le sujet.

    HS: je sais bien que le probleme vient du multithread, et pas des multicores en eux meme, mais je me met au multithread pour pouvoir profiter des multicores a 100% donc l'un dans l'autre, c'est quand meme de leur faute.
    Je viens de trouver sous Linux une fonction atomic_add() qui fait la même chose (semble t'il) que InterlockedIncrement() sous windows

    http://www.delafond.org/traducmanfr/...mic_add.9.html

    donc une classe spécifique CAtomic codée avec des #ifdef WINDOWS ou #ifdef LINUX devrait résoudre ton problème de portabilité

    Peut être qu'il y a un equivalent déjà tout fait dans la librairie boost mais je ne connais pas suffisemment

    Raymond
    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
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    La bibliotheque Loki propose des operations atomiques prévues pour fonctionner en multithread. Je te conseille d'y jeter un coup d'oeil, ainsi qu'au livre Modern C++ Design qui en parle, si tu peux le dégotter.

    PS : et c'est cross platform

  6. #6
    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
    Il y a diverses bibliothèques à proposer une surcouche portable aux compteurs atomiques :
    - Loki donc (j'avais complètement zappé)
    - boost (caché au fin fond des shared_ptr -- il y a juste un boost/details/????.hpp à inclure je crois)
    - ACE
    - STLsoft (Matthew Wilson en parle dans son Imperfect C++ qui a tout un chapitre dédié au MT)
    - Qt très probablement vu que c'est utilisé pour implémenter leur COW
    - ...
    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...

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

Discussions similaires

  1. [C#] Comment incrémenter une variable session ?
    Par Sup@Lou dans le forum ASP.NET
    Réponses: 5
    Dernier message: 14/05/2006, 18h24
  2. [XSLT] comment incrementer un compteur
    Par sidi.elmoctar dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/05/2006, 10h49
  3. [Débutant] Comment faire un compteur pour un bouton?
    Par Paulinho dans le forum AWT/Swing
    Réponses: 21
    Dernier message: 07/01/2006, 20h51
  4. [MultiThread] Comment ça marche ?
    Par jaguar74 dans le forum Langage
    Réponses: 1
    Dernier message: 04/01/2006, 15h23
  5. [CR8.5] Comment faire un compteur ?
    Par sperron dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 09/06/2005, 09h07

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