web-dev-qa-db-fra.com

Pool de threads C ++

Qu'est-ce qu'une bonne implémentation open source d'un pool de threads pour C++ à utiliser dans le code de production (quelque chose comme boost)?

Veuillez fournir votre propre exemple de code ou un lien vers un exemple d'utilisation de code.

42
Amir Rachum

Je pense qu'il n'est toujours pas accepté dans Boost, mais un bon point de départ: threadpool . Un exemple d'utilisation, du site web:

#include "threadpool.hpp"

using namespace boost::threadpool;

// Some example tasks
void first_task()
{
  ...
}

void second_task()
{
  ...
}

void third_task()
{
  ...
}

void execute_with_threadpool()
{
  // Create a thread pool.
  pool tp(2);

  // Add some tasks to the pool.
  tp.schedule(&first_task);
  tp.schedule(&second_task);
  tp.schedule(&third_task);

  // Leave this function and wait until all tasks are finished.
}

L'argument "2" du pool indique le nombre de threads. Dans ce cas, la destruction de tp attend la fin de tous les threads.

21
Diego Sevilla

Vous voudrez peut-être regarder http://threadpool.sourceforge.net/

Il n'est pas difficile d'implémenter pool de threads vous-même en utilisant Boost.Thread . En fonction de la tâche, vous souhaiterez peut-être utiliser verrouillé conteneur pour la file d'attente au lieu d'un de Bibliothèque de modèles standard . Par exemple, fifo conteneur de lock free bibliothèque.

Bonne chance!

9
user405725

J'ai écrit un petit exemple ici . Fondamentalement, ce que vous devez faire est d'implémenter ce morceau de code:

asio::io_service io_service;
boost::thread_group threads;
auto_ptr<asio::io_service::work> work(new asio::io_service::work(io_service)); 

// Spawn enough worker threads
int cores_number = boost::thread::hardware_concurrency();
for (std::size_t i = 0; i < cores_number; ++i){
    threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
}
// Post the tasks to the io_service
for(vector<string>::iterator it=tasks.begin();it!=tasks.end();it++){
   io_service.dispatch(/* YOUR operator()() here */);
}
work.reset();
7
tonicebrian

Je crois que vous pouvez émuler un pool de threads avec un io_service dans boost :: asio. Vous pouvez contrôler le nombre de threads disponibles pour le pool io_service, puis vous pouvez "publier" des tâches sur le io_service, qui seront exécutées par l'un des threads du pool. Chacune de ces tâches doit être un foncteur (je crois).

Je ne peux pas mettre d'exemple ici pour le moment, mais la documentation asio sur les pools io_service expliquera comment cela peut être fait.

3
Nim

Voici une simple file d'attente de tâches uniquement en-tête utilisant un pool de threads (construit sur Boost): taskqueue.hpp

La page du projet TaskQueue comprend un exemple d'application démontrant comment l'utiliser :

1
heathbar

Un exemple d'implémentation utilisant le cadre ffead-cpp est décrit ici . Il fournit une implémentation directe, basée sur les priorités et un pool de threads planifié. Vérifiez-le...

0
Sumeet

Cette bibliothèque s'appuie sur Boost.Thread. Il y a un tutoriel court avec un exemple de code. Si cela ne fait pas ce que vous voulez, vous pouvez l'utiliser comme référence.

Assurez-vous que vous êtes sur une version Boost> = 1,37 si vous suivez cette voie.

0
Steve Townsend