<li>Le thread principal (fonction <code>main</code>) s’occupe seulement de gérer les arguments de la ligne de commande, initialiser les structures de données, et créer les threads.</li>
<li>Un thread est dédié à la gestion du clavier.</li>
<li>Un ou plusieurs threads <em>travailleurs</em> sont dédiés au calcul du prochain état des cellules : nouvelles positions (en fonction de la vitesse de la cellule) et <strong>détection de collisions</strong> entre certains éléments. Ces événements de collisions potentielles sont stockés dans une seule structure de données concurrente (file, pile, etc.). Il est <strong>important</strong> que tous les threads <em>travailleurs</em> déplacent leurs cellules assignées, puis s’attendent <strong>avant</strong> de réaliser la détection de collisions. Un thread traite une ou plusieurs cellules (de manière équitable).</li>
<li>Un seul thread <em>collisionneur</em> est dédié au <strong>traitement des collisions</strong> entre certains éléments (lecture des événements de la liste concurrente) et à <strong>l’affichage</strong>.</li>
<li>Un ou plusieurs threads <em>travailleurs</em> sont dédiés au calcul du prochain état des cellules : nouvelles positions (en fonction de la vitesse de la cellule), rebonds éventuels contre les bords et <strong>détection de collisions</strong> entre entités (cellules et particules). Ces événements de collisions potentielles sont stockés dans une seule structure de données concurrente (file, pile, etc.). Il est <strong>important</strong> que tous les threads <em>travailleurs</em> déplacent leurs cellules assignées, puis s’attendent <strong>avant</strong> de réaliser la détection de collisions. Un thread traite une ou plusieurs cellules (de manière équitable).</li>
<li>Un seul thread <em>collisionneur</em> est dédié au <strong>traitement des collisions</strong> entre entités (lecture des événements de la liste concurrente) et à <strong>l’affichage</strong>.</li>
</ul>
<p>Concernant les collisions, deux variantes sont possibles :</p>
<p>Concernant les collisions entre cellules et particules, deux variantes sont possibles :</p>
<ol type="1">
<li>Chaque thread <em>travailleur</em> réalise uniquement la détection de collisions entre cellules et entre cellules et particules de nourriture, puis délègue totalement le traitement de ces collisions à l’unique thread <em>collisionneur</em>.</li>
<li>Chaque thread <em>travailleur</em> détecte toutes les collisions, mais traite les collisions entre cellules et particules de nourriture. L’unique thread <em>collisionneur</em> ne traite en conséquences uniquement que les collisions entre cellules.</li>