L'objectif de l'exercice était de découvrir le multithreading en C++. J'en ai profité pour utiliser les dernières fonctionnalités de C++17, afin d'écrire du code aussi moderne et optimisé que possible. (fonctions lambda, std::list, std::vector, std::thread, move, find)
Analyser un ensemble d’emails (1 fichier = 1 email) pour déterminer, par expéditeur, combien de mails ont été envoyés à chaque destinataire, en utilisant le multithreading pour améliorer les performances du programme.
- Chaque ligne correspond à un expéditeur.
- Pour chaque expéditeur : liste des destinataires et le nombre de mails envoyés à chacun.
Format type :
expediteur.txt: nb1:destinataire1 nb2:destinataire2 ...
- Lire une base d'emails dans un dossier (1 fichier = 1 email).
- Paralléliser le parsing de ces emails avec plusieurs threads.
- Enregistrer les résultats intermédiaires dans
threads/. - Fusionner tous les résultats pour produire un fichier final
results.txt.
- Crée un dossier
threads/pour stocker les résultats par thread.
- Cherche tous les fichiers dans
./maildir. - Découpe la liste en parts égales selon le nombre de threads CPU disponibles (
hardware_concurrency()).
- Chaque
Workerreçoit une liste de fichiers. - Chaque
Workerest lancé pour analyser sa partie (classeWorkerdéfinie ailleurs).
- Lit les fichiers produits par chaque thread dans
threads/. - Trie les fichiers par nom d’expéditeur.
- Regroupe les résultats : pour chaque expéditeur, compte combien de fois il a envoyé un mail à chaque destinataire.
- Écrit tout dans
results.txt.