Pour résoudre un problème (et mieux comprendre le multitâche), j'ai écrit une petite implémentation de pool de threads. Ce pool de threads génère un certain nombre de threads de travail qui détachent les tâches d'une file d'attente au fur et à mesure qu'elles sont ajoutées par le client du pool de threads. Pour les besoins de cette question, lorsque la file d'attente de tâches est vide, les threads de travail sont tous terminés. Après avoir effectué une analyse de base, j'ai découvert que l'application consacrait environ 60% de son temps à l'acquisition du verrou de la file d'attente. Vraisemblablement, cela se passe principalement dans les fils de travail.Optimisation de l'utilisation des threads de travail
Est-ce simplement une indication que je ne donne pas assez de travail aux threads de travail, ou quelque chose de plus? Y a-t-il quelque chose de simple que je puisse manquer pour augmenter le débit du fil de travail?
EDIT: Voici un pseudo-code approximatif qui devrait illustrer quelque peu les choses. Ce sont les deux seuls endroits où un verrou est acquis/libéré lors de l'exécution des threads de travail (ce qui est une grande majorité du temps d'exécution de l'application.)
std::list<task_t> task_list;
// Called by the client to add tasks to the thread pool
void insert_task(const task_t& task)
{
lock_type listlock(task_mutex);
task_list.push_back(task);
}
// The base routine of each thread in the pool. Some details
// such as lifetime management have been omitted for clarity.
void worker_thread_base()
{
while (true)
{
task_t task;
{
lock_type listlock(task_mutex);
if (task_list.empty())
continue;
task = task_list.front();
task_list.pop_front();
}
do_task(task);
}
}
Nous avons besoin de voir du code pour voir pourquoi votre application est bloquée sur le verrou de la file d'attente. Je pense que vos threads devraient être bloqués sur un état "wait" (en utilisant une variable de condition ou quelque chose de similaire) la plupart du temps. – Starkey