Multithreading Win32 : SafeQueue et arène à 4 threads
Une semaine de multithreading en C++ avec l'API Win32 : file thread-safe, producteurs-consommateurs, détection de collisions parallèle, puis une arène SFML où quatre WorkerThreads se partagent la carte et communiquent par messages
C++ · Win32 · Multithreading · SFML · Producteur-consommateur · Solo
Une semaine de multithreading en C++ avec l'API Win32 en GTech 3 : des exercices quotidiens, puis une arène où quatre threads se partagent la carte.
Contexte
Semaine du 17 au 24 novembre 2025. Les notes de cours (théorie, threads Win32, thread safety) sont rangées dans
Semaine Exo/Doc/. Travail individuel.
Ce que j'y ai fait
Les quatre exercices de la semaine, puis deux versions de l'arène SFML : TestMessage (des boules qui changent de
thread en changeant de zone) et TestComplet (joueurs, bonus, combats et fin de partie). Les dégâts d'une collision
distante, les transitions de zone et les récompenses partent en message dans la SafeQueue du thread qui possède
l'entité visée.
Liens
- 5---Multithreading (code sur la branche
Kiki)
Exercices de la semaine (Semaine Exo/)
| Jour | Exercice | Contenu |
|---|---|---|
| J1 | WhackAThread | Jeu de taupe en console : chaque taupe est un thread (CreateThread), un thread lance les taupes, les événements passent par une file de messages |
| J2-3 | SafeQueue | File bornée en tampon circulaire : CRITICAL_SECTION et deux CONDITION_VARIABLE (pas pleine, pas vide), push bloquant, tryPush / tryPop, test producteurs-consommateurs |
| J3 | CollisionDetector | Collisions entre 50 000 sphères : version mono-thread, puis 2 et 4 threads, thread de suivi de la progression (Interlocked*) |
| J3-4 | SafeCollision | Même détection en producteurs-consommateurs à travers la SafeQueue, cinq configurations comparées, dont une avec accumulation locale des résultats |
Arène finale (Final/TestComplet)
Thread principal : rendu SFML (800 x 600), fin de partie, statistiques
ThreadManager
└── 4 WorkerThreads, chacun avec ses entités et une SafeQueue<Message*>
boucle de 16 ms : messages -> mise à jour -> collisions -> transitions
Carte : grille de 4 x 3 cellules de 200 px, cellule -> thread (index modulo 4)
- 12 joueurs, 8 bonus (PV, vitesse, bouclier, dégâts). Le dernier joueur en vie gagne.
- Collision locale (deux joueurs du même thread) : dégâts et rebond calculés sur place.
- Collision distante : le thread d'indice le plus bas l'applique à son joueur et envoie un
CollisionMessageà l'autre thread, plus unKillRewardMessagesi son joueur meurt. - Transition : un joueur qui change de cellule est sérialisé dans un
TransitionMessage, retiré de son thread et recréé dans le thread cible. La couleur du joueur indique son thread.
Stack
| Tech | Rôle |
|---|---|
| C++ | Langage |
| API Win32 | CreateThread, CRITICAL_SECTION, CONDITION_VARIABLE, Interlocked* |
| SFML 2.6.1 | Rendu de l'arène |
| Visual Studio | Build |