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

Boost C++ Discussion :

Boost::thread : utilité de certaines classes ?


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut Boost::thread : utilité de certaines classes ?
    Salut à tous,
    Je suis en train de plancher sur la bibliothèque de gestion de threads de Boost, et j'ai une question à laquelle je ne parviens pas à répondre :
    Quelle est l'utilité des classes lock_guard, unique_lock, upgrade_lock et compagnie ?

    De ce j'ai compris, il suffit d'instantier un boost::mutex, boost::timed_mutex, boost::shared_mutex, etc. en fonction de ses besoin et de faire appel à lock() et unlock() (ou lock_shared(), etc.). Ca marche très bien comme ça, j'ai essayé avec des centaines de threads en même temps sur plusieurs ressources partagées, et les concepts de propriété exclusive, partagée, upgradable, etc. sont toujours respectés.

    Donc du coup, je comprends pas pourquoi on irait s'embêter à instantier un objet boost::lock_guard ou autre pour locker ces mutexs, je vois pas ce que cela apporte en plus.
    Est-ce que j'aurais loupé quelque chose ?
    Merci ^^

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Je pense que scope_lock permet de gérer le problème des exceptions (comme les pointeurs intelligents pour les delete). Après, c'est le seul lock dont je me serve donc...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut
    Salut,
    Merci pour ta réponse,
    Il me semble (d'après la documentation de l'API) que scope_lock est un typedef de unique_lock <> avec le type de mutex utilisé (mutex, shared_mutex, etc.) comme paramètre du template. Donc ça m'intéresse, puisque ce qui m'intéresse ce sont les classes définies ici : lock_guard, unique_lock, shared_lock, etc.
    En quoi cela aide-t-elle donc par rapport aux risques d'exceptions ?
    Sinon, je pense qu'il me manque une compréhension générale de l'utilité de ces classes, par rapport à MUTEX.lock(), MUTEX.unlock(), etc.
    Merci !

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Si ma mémoire est bonne, ce sont des enveloppes RAII pour les mutex.

    Citation Envoyé par ehmicky Voir le message
    En quoi cela aide-t-elle donc par rapport aux risques d'exceptions ?
    Sinon, je pense qu'il me manque une compréhension générale de l'utilité de ces classes, par rapport à MUTEX.lock(), MUTEX.unlock(), etc.
    Si la fonction lève une exception avant le unlock() du mutex, soit celui reste locked (si qui est probablement une erreur), soit tu dois te débrouiller à gérer le cas avec la main ce qui est fastidieux et source d'erreur.
    Alors qu'en cas d'exception, les variables locales sont détruites proprement. Dans le cas d'objet lock, le destructeur appel unlock() sur le mutex correspondant. Le mutex est donc bien libéré en cas d'exception sans avoir à le gérer soi-même (il est d'ailleurs également libéré lors de la sortie normale de la fonction, sans appel explicite à unlock).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut
    Salut,
    Merci, ok j'ai compris ! En gros : utiliser de tels classes, et non les fonctions MUTEX.lock(), etc., car ces dernières ne sont pas exception-safe

    J'en profite pour poser une seconde question liée, mais n'étant pas la question originale, si vous le voulez bien :
    J'ai déjà manipulé les threads via Glibc, puis SFML, maintenant je pense que Boost est une des meilleurs solutions en la matière (interopérable, efficace, extensible, etc.). A chaque fois, je sais pas trop comment me dépatouiller avec la portée des mes mutexs. Je leur donne une portée globale, pour qu'ils soient partagés par tous les threads, mais il me semble qu'il s'agisse d'une mauvaise pratique. Je me disais donc qu'il fallait peut-être construire une classe gérant tous les mutexs d'une application multi-thread possible, mais j'ignore si c'est une bonne pratique.
    Auriez-vous des conseils à me donner en ce qui concerne le design / modélisation de la gestion de la synchronisation des threads ? Merci !

  6. #6
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Disons qu'avec le pattern RAII, tu n'a pas à gérer la complexité de l'unlocking, si 1/ tu as des exceptions 2/ si tu as plein de conditions de sorties différentes (dans tous les chemins, il faut rajouter un unlock correctement).

    Sinon pour la place des mutex, ils doivent être déclarés / initialisés au plus prêt de la ressouce qu'ils protègent

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

Discussions similaires

  1. [Thread] Reveiller un thread a partir d'un autre thread d'une autre classe
    Par arnolpourri dans le forum Concurrence et multi-thread
    Réponses: 18
    Dernier message: 11/04/2007, 15h18
  2. [MFC] rendre un thread membre d'une classe.
    Par giova_fr dans le forum MFC
    Réponses: 6
    Dernier message: 20/02/2006, 18h37
  3. Suite Thread Simultanés: instances de classe differentes?
    Par macgile dans le forum Framework .NET
    Réponses: 3
    Dernier message: 04/01/2006, 09h50
  4. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15
  5. [Plugin] Comment instantier certaines classes de ANT ?
    Par relivio dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 01/04/2004, 15h45

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