← Tous les projets d'école

terminé2025

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

GitHub ↗

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

Exercices de la semaine (Semaine Exo/)

JourExerciceContenu
J1WhackAThreadJeu 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-3SafeQueueFile bornée en tampon circulaire : CRITICAL_SECTION et deux CONDITION_VARIABLE (pas pleine, pas vide), push bloquant, tryPush / tryPop, test producteurs-consommateurs
J3CollisionDetectorCollisions entre 50 000 sphères : version mono-thread, puis 2 et 4 threads, thread de suivi de la progression (Interlocked*)
J3-4SafeCollisionMê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 un KillRewardMessage si 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

TechRôle
C++Langage
API Win32CreateThread, CRITICAL_SECTION, CONDITION_VARIABLE, Interlocked*
SFML 2.6.1Rendu de l'arène
Visual StudioBuild