Je sais qu'en général, pour ce genre de choses, je prévois des systèmes très optimisés pour garantir les performances. Les FIFO, par exemple, sont gérées sans mutex, j'use et abuse des fonctions atomiques (type InterlockedExchange, InterlockedIncrement, etc.), et je ne fais bien entendu passer que des pointeurs. Je rends les données indissociables entre elles par des ajouts systématiques de structures d'encapsulation, afin de ne toujours avoir besoin que d'un seul pointeur à manipuler.
En général, si tu ne mets pas de mutex inutiles, tes performances ne sont conditionnées que par peu d'éléments :
- Vitesse de commutation de contexte après signalement du sémaphore.
Bien entendu, les OS temps réel s'en sortent mieux que les OS généralistes à ce niveau. Toutefois, Windows (kernel NT) et Linux (kernel 2.6) offrent en général des performances correctes. - Gestion réelle des threads : dépend de l'OS, bien sûr, et aussi du nombre de cœurs disponibles.
En général, je dimensionne mon pool de threads par rapport au nombre de cœurs, de façon à ne pas avoir de threads "inutiles" tout en ayant une utilisation maximale du CPU.
Côté objets, un "vrai" pool de threads n'est pas forcément nécessaire (voire souhaitable...) dans un tel contexte : contrairement à l'usage possible sur un serveur, par exemple HTTP ou BDD, il n'y a pas de "pics" de charge à assurer, ni de fluctuations très importantes dans la répartition de la charge. Soit tes threads bossent, soit ils ne foutent rien, mais tu n'as pas de grosses contraintes de répartition à faire. Du coup, un simple tableau d'objets-threads suffit en général amplement.
L'autre point critique, ce sont les FIFO : il est préférable de bien travailler leurs performances, et de tenter au maximum d'éviter l'utilisation de mutex. Souvent, on peut se passer de mutex sur une des extrémités de la FIFO (soit côté application, soit côté threads de travail) : c'est toujours bon à prendre, et de préférence côté threads de travail.
Toutefois, cela demande pas mal de boulot de faire ça, et les FIFO "toutes prêtes" sont rarement idéales.
Partager