42 votes

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.

21voto

Diego Sevilla Points 17274

Je pense que ce n’est toujours pas accepté dans Boost, mais un bon point de départ: threadpool . Quelques exemples d’utilisation, tirés 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.

7voto

ancechu Points 1458

J'ai écrit un petit exemple ici . En gros, vous devez 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();
 

3voto

Nim Points 22570

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 dans le pool io_service, puis "poster" des tâches sur le serveur 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 donner d’exemple ici pour le moment, mais la documentation asio sur les pools io_service décrira comment cela peut être fait.

1voto

DarioP Points 1350

Vous pouvez trouver une bonne introduction aux pools et quelques exemples d'implémentation avec c ++ 11 dans le chapitre 9 de l' accès simultané à C ++ en action, par Anthony Williams

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X