Je ne mesure peut-être pas correctement mais j'ai un code simple avec lequel je joue. Je ne pense pas que c'est un pool de threads parce que si je rends l'unité de travail très grande alors le processeur va à 190-199% (j'ai dual core) mais si je baisse, l'unité de travail est plus petite exécute le programme à 140-160%. Je pense que les threads ne sont pas regroupés mais sont détruits/créés en cas de besoin, ce qui ralentit le programme lorsque les charges de travail sont plus petites. J'utilise tbb::task_scheduler_init
pour contrôler le nombre de threads mais je ne sais pas comment dire à tbb de garder le thread en vie.Comment créer un pool de threads en C++ TBB?
est ici un code pour illustrer le problème:
#include <iostream>
#include <list>
#include <tbb/task.h>
#include <tbb/task_group.h>
//#include <stdlib.h>
#include "tbb/task_scheduler_init.h"
#include <boost/thread.hpp>
using namespace tbb;
long fib(long a)
{
if (a < 2) return 1;
return fib(a - 1) + fib(a - 2);
}
class PrintTask
{
public:
void operator()()
{
//std::cout << "hi world!: " << boost::this_thread::get_id() << std::endl;
fib(10);
}
};
int main()
{
tbb::task_scheduler_init init(4); //creates 4 threads
task_group group;
for (int i = 0; i < 2000000; ++i)
{
group.run(PrintTask());
//std::cout << i << std::endl;
}
std::cout << "done" << std::endl;
group.wait();
return(0);
}
si vous changez fib à 40-45, le travail pour chaque fil devient grande de sorte qu'il frappe pleine vitesse, mais si vous utilisez la configuration actuelle puis la les emplois sont très petits mais ils en font beaucoup.
note: Une chose que j'ai remarquée peut-être liée est que dans le cas ci-dessus, il utilise complètement ma mémoire (4 concerts gratuits). Le ralentissement pourrait-il être lié à cela? Aussi pourquoi ce programme prendrait-il toute la mémoire? Que stocke-t-il en mémoire, si je n'appelle que le thread, n'y a-t-il pas une file d'attente lui indiquant combien de fois il doit s'exécuter ou est-ce qu'il sauvegarde le thread entier en mémoire pour s'exécuter?
Désolé pour les questions étranges, j'ai lu le tutoriel, mais je suis encore confus à son comportement (même si j'obtiens le résultat escompté).
Merci.
Je ne suis pas tout à fait sûr de la question.Il est peu probable que TBB crée/détruise des threads, si vous pensez qu'il pourrait être vérifier le threadid. – Rick
@Rick ahhh votre droit ... alors peut-être que j'ai un malentendu plus profond de threads, car pourquoi un travail plus petit le fait courir plus lentement? Je ne partage aucune donnée entre les threads, donc le verrouillage ne devrait pas être un problème. la seule chose à laquelle je pouvais penser était que les threads prenaient du temps à démarrer (mais à droite, les identifiants des threads sont les mêmes). – Lostsoul
lorsque j'essaye l'équivalent Java avec un pool de threads et 'executor.submit' pour envoyer du travail, alors il semble fonctionner constamment à près de 190% + – Lostsoul