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.
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.
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!
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();
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.
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 :
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.