Pour ressusciter ce vieux fil de discussion, je viens de faire quelques tests de code simples :
#include <thread>
int main(int argc, char** argv)
{
for (volatile int i = 0; i < 500000; i++)
std::thread([](){}).detach();
return 0;
}
Je l'ai compilé avec g++ test.cpp -std=c++11 -lpthread -O3 -o test
. Je l'ai ensuite exécuté trois fois de suite sur un vieil ordinateur portable (noyau 2.6.18) très chargé (en train de reconstruire une base de données) et lent (Intel core i5-2540M). Résultats de trois exécutions consécutives : 5.647s, 5.515s, et 5.561s. Il s'agit donc d'un peu plus de 10 microsecondes par thread sur cette machine, probablement beaucoup moins sur la vôtre.
Ce n'est pas beaucoup de frais généraux, étant donné que les ports série ont une vitesse maximale d'environ 1 bit par 10 microsecondes. Maintenant, bien sûr, il y a diverses pertes de threads supplémentaires que l'on peut obtenir impliquant des arguments passés/capturés (bien que les appels de fonction eux-mêmes puissent en imposer), des ralentissements de cache entre les cœurs (si plusieurs threads sur différents cœurs se battent sur la même mémoire en même temps), etc. Mais en général, je doute fortement que le cas d'utilisation que vous avez présenté ait un impact négatif sur les performances (et pourrait même apporter des avantages), même si vous avez déjà qualifié le concept de "code vraiment terrible" sans même savoir combien de temps il faut pour lancer un thread.
Le fait que ce soit une bonne idée ou non dépend beaucoup des détails de votre situation. De quoi d'autre le fil conducteur est-il responsable ? Qu'est-ce qui est précisément impliqué dans la préparation et la rédaction des paquets ? À quelle fréquence sont-ils écrits (avec quel type de distribution ? uniforme, en grappes, etc... ?) et quelle est leur structure ? Combien de cœurs le système possède-t-il ? Etc. Selon les détails, la solution optimale pourrait être n'importe où, de "pas de threads du tout" à "un pool de threads partagé" à "un thread pour chaque paquet".
Notez que les pools de threads ne sont pas magiques et peuvent dans certains cas constituer un ralentissement par rapport aux threads uniques, car l'un des plus gros ralentissements avec les threads est la synchronisation de la mémoire cache utilisée par plusieurs threads en même temps, et les pools de threads, par leur nature même, doivent rechercher et traiter les mises à jour d'un autre thread. Ainsi, votre thread primaire ou votre thread de traitement enfant peut se retrouver coincé à devoir attendre si le processeur n'est pas sûr que l'autre processus ait modifié une section de la mémoire. En revanche, dans une situation idéale, un thread de traitement unique pour une tâche donnée ne doit partager la mémoire avec la tâche qui l'appelle qu'une seule fois (au moment de son lancement), puis ils n'interfèrent plus jamais l'un avec l'autre.
0 votes
Un seul fil de travail permettra de résoudre certains des autres types de conflits de ressources que vous pourriez avoir avec plusieurs fils (écritures entrelacées, etc.).
0 votes
Je voudrais dire que oui, c'est une chose horrible à faire - ce qui m'amène à ma question, combien de frais généraux sont encourus lors de la création d'un fil (en général) Franchement, je ne sais pas comment déterminer ou même mesurer une implémentation de la bibliothèque pthread.
13 votes
Les frais généraux sont 0.37% si le message est de la bonne taille.