Utiliser des threads dans ses programmes ncessite gnralement une connaissance de chaque plateforme utilise, les interfaces pour les threads ne sont pas standardises en C++. Des bibliothques dites portables existent, permettant de faire les liens manquants. Par exemple Boost.Threads.
Introduction I - Dmarrer avec Boost.Threads II - L'architecture de la bibliothque II-A - Les mutex II-A-1 - Les stratgies de blocage II-A-1-a - La stratgie rcursive II-A-1-b - La stratgie vrifie II-A-1-c - La stratgie non vrifie II-A-1-d - La stratgie non spcfie II-A-2 - Les politiques II-A-2-a - La politique FIFO II-A-2-b - La politique de priorit II-A-2-c - La politique non spcifie II-A-3 - Les concepts de mutex II-A-3-a - Le concept standard II-A-3-b - Le concept d'essai II-A-3-c - Le concept de temp II-A-4 - Rsum des mutex II-B - Les lock II-B-1 - Qu'est ce qu'un lock ? II-B-2 - Le concept de ScopedLock II-B-3 - Le concept de TryLock II-B-4 - Le concept de ScopedTryLock II-B-5 - Le concept de TimedLock II-B-6 - Le concept de ScopedTimeLock II-B-7 - Rsum des lock II-C - Les threads II-C-1 - La classe thread II-C-1-a - Constructeurs et destructeur II-C-1-b - Les comparaisons II-C-1-c - La mthode join() II-C-1-d - Quelques fonctions statiques II-C-2 - La classe thread_group II-C-3 - Une classe bien particulire : thread_specific_ptr II-D - Les autres classes et fonctions II-D-1 - La classe xtime II-D-2 - La fonction call_once II-D-3 - La classe barrier II-D-4 - La classe condition III - Exemples III-A - Un exemple simple III-B - Un exemple plus complexe V - Conclusion
-2Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
Introduction
Les threads permettent d'excuter du code en parallle, de manire indpendante et asynchrone. Chaque thread appartient un processus qui l'a cr, mais ils utilisent chacun le processeur comme s'ils taient seuls. Les programmes utilisant les threads sont appels multithreads, les autres programmes qualifis de monothreads. Les avantages des programmes utilisant les threads sont nombreux. Par exemple, l'attente d'un vnement externe peut bloquer un programme et la dporter dans un thread peut permettre l'application de rpondre. Si on possde plusieurs coeurs, ou plusieurs processeurs/units d'excutions, parallliser son application peut permettre d'acclrer un programme. En revanche, les inconvnients sont tout aussi nombreux, et plus sournois. Par exemple, lorsque 2 threads veulent accder en criture une ressource, on ne peut garantir le rsultat aprs les accs. On peut aussi rencontrer des problmes d'accs aux ressources - 2 threads dsirant obtenir un maximum de mmoire et occupant toute mmoire disponible, mais pas suffisemment sans pouvoir la rendre -. Ces erreurs ne sont pas particulires ou rares, elles sont courantes si on ne fait pas attention. Boost.Thread essaie de remdier aux erreurs d'inattention de base. Parmi les dernires considrations avant de se lancer, il faut noter le problme des tests et du dbuggage. Un programme simple, monothread, est simple dbugger, tout se droule ligne aprs ligne, instruction aprs instruction. Un programme multithread n'a pas cette facult. Pendant une excution, une instruction peut s'excuter aprs une autre, puis la suivante, c'est l'inverse. On ne peut donc pas rpter les erreurs, les versions debug n'ont pas le mme comportement que les versions release, ... Cette bibliothque ncessite une version compile de Boost.
-3Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
-4Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
II - L'architecture de la bibliothque
L'architecture de la bibliothque est constitue de 2 parties, mme si d'autres sont en projet. La premire contient les primitives de base pour la synchronisation, la deuxime contient les threads eux-mmes.
Mutex TryMutex
-6Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
boost::recursive_timed_mutex
Expressions Effets L lk(m); Construit un objet lk, associe le mutex m et appele lock() L lk(m, Construit un b); objet lk, associe le mutex m et si b, appele lock()
-8Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
Expressions Effets lk.timed_lock() Lve boost::lock_error si locked(). Tente de bloquer le mutex pendant le temps t. S'il s'agit du mme thread, la raction dpend de la stratgie du mutex. Retourne true si le bloquage a t effectu, false sinon.
TryLock ScopedTryLock
Lock TryLock
TimedLock ScopedTimedLock
TryLock TimedLock
-9Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
La partie la plus intressante puisque sans elle, la bibliothque ne sert pas grand chose. Les threads peuvent tre regroups en groupe de threads. Toutes ces classes sont non copiables.
- 10 Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
Cette classe bien particulire permet de stocker dans un seul objet plusieurs pointeurs, en fait un par thread. Lors de la destruction d'un thread, le pointeur associ est dtruit l'aide d'une fonction que l'on peut spcifier. Elle peut servir dans le cas de portage d'une interface vivant auparavant dans un environnement monothread, ou si chaque thread doit accder des ressources physiquement uniques mais accessible travers un point d'accs global - par exemple si on lance plusieurs fois une mme fonction en parallle -. Un des constructeurs prend en argument un void (*cleanup)(void*). Cette fonction est appele la destruction de l'objet point lors de la destruction du thread. On peut aussi passer le pointeur NULL permettant de ne rien effectuer. La fonction release cde la gestion du pointeur et le renvoie la fonction appelante. La fonction reset permet de changer le pointeur grer pour le thread courant tout en appelant la fonction charge pour le nettoyage. Les fonctions get, operator-> et operator*()() retourne le pointeur gr par l'objet pour le thread courant, sauf pour operator*()() qui retourne en fait une rfrence et donc qui ncessite d'avoir un pointeur gr non nul.
- 11 Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
Quatre fonctions wait existent. La premire libre le mutex associ au lock donn en paramtre, bloque le thread en attendant l'appel notify_one et rebloque le mutex. La deuxime effectue la squence prcdente si le deuxime argument peut tre converti true. Le troisime prend comme deuxime paramtre un temps xtime et retourne true si ce temps est atteint. La dernire est une combinaison des prcdentes fonctions. Les fonctions notity_one et notify_all permettent de librer un ou tous les threads en attente de la condition.
- 12 Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
III - Exemples
Quelques petits exemples de fonctionnement
#include <boost/thread/thread.hpp> #include <boost/thread/thread_group.hpp> #include <vector> // Une variable globale qui pourra tre encapsule au besoin boost::thread_specific_ptr<int> value; // Une variable globale avec son mutex, le tout devrait tre dans une classe englobante std::vector<unsigned int> traitement; boost::mutex mutexTraitement; void uneFonctionPlusieursThreads() { { boost::mutex::scoped_lock lock(mutexTraitement); // Accde aux donnes de traitement en toute scurit } value.reset(new int); // On cre des donnes spcifiques au thread // Traitement sur value } int main() { boost::thread_group group; for(unsigned int i = 0; i < 10; ++i) { group.create_thread(&uneFonctionPlusieursThreads); } group.join_all(); }
- 13 Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
V - Conclusion
Cette bibliothque n'est pas encore aboutie, il manque encore beaucoup de choses comme des stratgies plus volues pour les mutex, mais on peut esprer que l'volution de la bibliothque ira dans le bon sens. Certains mutex ont t supprims depuis quelques versions cause de blocages - les mutex boost::read_write_mutex encore prsent en partie dans la documentation -, la preuve qu'il est difficile de concevoir une telle bibliothque.
- 14 Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/
- 15 Copyright 2006 - Matthieu Brucher. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de domages et intrts.
http://matthieu-brucher.developpez.com/tutoriels/cpp/boost/thread/