Responsables : Joël Falcou et Jean-Thierry Lapresté Présenté par : Maxence Schmitt et Romain...

Preview:

Citation preview

Responsables : Joël Falcou et Jean-Thierry LaprestéPrésenté par : Maxence Schmitt et Romain Guidoux 22 Mars

2011

IntroductionCréer une bibliothèque C++

Simplification de la gestion des threads

Utilisation de bibliothèques Boost

Etude des différentes solutions possibles

2

PlanIntroduction

1.Présentation du patron de conception « Objets Actifs »

2.Les implémentations proposées

3.Détail de l’implémentation réalisée

Conclusion

3

Les threadsUn processeur n’exécute qu’un seul thread à un instant tImpression d’exécution parallèle pour l’utilisateur

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation SérialisationFile de messages

4Résultats

Les threads en C++Solutions disponibles :

Qt : Qthread

Bibliothèque POSIX : pthread

Boost : Boost.Threads

5

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Les sections critiquesGestion des ressources critiques

Exclusion mutuelle (mutex)

6

using namespace std;int nb = 4;

void threadWork(){ if (nb % 2 == 0) cout << "Pair : " << nb << endl; else cout << "Impair : " << nb << endl;

// Un traitement compliqué ici nb++;}

int main(void){ try { boost::thread unThread(&threadWork); unThread.join(); } catch (exception &e) {} return 0;}

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Les objets actifsArticle d’Herbert Sutter : ”Prefer Using Active Objets

Instead of Naked Threads”

Rendre asynchrones des méthodes d’un objet

Cacher la manipulation des threads

7

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Solution 1 : fonctions lambda Fonction sans nom définie pour un usage ponctuel

8

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Solution 1 : fonctions lambda Syntaxe utilisée par Sutter -> prochaine norme de C++

Recherches dans Boost.Lambda et Boost.Phoenix Utilisation uniquement dans les boucles

9

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Solution 2 : héritageA chaque méthode asynchrone correspond un sous-type de Message

10

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Choix de l’implémentationUtilisation des fonctions lambda impossible

Solution à base d’héritageClasse Message interne à l’Active Helper

Boost.Thread pour l’implémentation des threads

11

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

File de messagesBoost.Interprocess

AvantagesFIFO

Synchronisée

Attente passive

12

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

File de messagesFile de messages système

Doivent être uniques

N’est pas génériqueTrouver une solution pour sérialiser les données

Solution alternativeFile normale concurrente

13

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Sérialisation

Boost.Serialization

Par redéfinition de méthodeserialize() ou save()/load()

Permet de gérer les arguments des Messages

14

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Sérialisation d’argumentsSérialisation d’un paramètre

Sérialisation d’un pointeur d’objet actif

15

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

Destruction d’un objet actifDestruction de l’objet actif

Destruction de l’activeHelper

Exécution des messages

Attente d’un message de fin

Fermeture thread

16

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

TestsTests réalisés

Méthode sans paramètre

Méthode avec paramètres

Pointeur vers l’objet actif

Plusieurs objets actifs

17

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

RésultatsLes messages d’un même objet actif patientent

jusqu’à leur exécution

Les paramètres sont bien pris en charges

Plusieurs objets actifs peuvent s’exécuter parallèlement

18

Patron Objets Actifs

Implémentations proposées

Implémentation réalisée

Threads Objets Actifs Lambda Héritage Présentation Sérialisation RésultatsFile de messages

ConclusionObjectifs atteints

Implémentation d’une version fonctionnelle du patron

Programme de testDocumentation d’utilisation

Ce qu’il reste à faire :Tests unitaires (Boost)Permettre le renvoi de résultats

19

Recommended