Grupo de hilos C++
multithreading boost (7)
¿Qué es una buena implementación de código abierto de un grupo de subprocesos para que C ++ lo use en el código de producción (algo así como impulsar)?
Proporcione su propio código de ejemplo o un enlace al uso de código de ejemplo.
Aquí hay una cola de tareas simple solo de encabezado que utiliza un grupo de subprocesos (construido en Boost): taskqueue.hpp
La página del proyecto TaskQueue incluye una aplicación de muestra que demuestra cómo usarla :
Creo que aún no es aceptado en Boost, pero es un buen punto de mira: threadpool . Algunos ejemplos de uso, desde el sitio 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.
}
El argumento "2" para el grupo indica el número de subprocesos. En este caso, la destrucción de tp
espera a que finalicen todos los hilos.
Creo que puedes emular un grupo de subprocesos con un io_service en boost :: asio. Puede controlar el número de subprocesos disponibles para el grupo io_service y luego puede "publicar" tareas en el io_service, que será ejecutado por uno de los subprocesos del grupo. Cada tarea debe ser un funtor (creo).
No puedo poner un ejemplo aquí en este momento, pero la documentación de ASIO sobre pools io_service explicará cómo se puede hacer esto.
Es posible que desee consultar threadpool
No es difícil implementar el grupo de subprocesos usando Boost.Thread . Dependiendo de la tarea, es posible que desee utilizar lock-free contenedor lock-free para la cola en lugar de uno de la Biblioteca de plantillas estándar . Por ejemplo, fifo
contenedor de lock free
biblioteca lock free
.
¡Buena suerte!
He escrito un pequeño ejemplo here . Básicamente lo que tienes que hacer es implementar esta pieza de código:
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();
threadpool.sourceforge.net/index.html basa en Boost.Thread. Hay un breve tutorial con algún código de ejemplo. Si esto no hace lo que desea, puede usarlo como línea de base.
Asegúrate de estar en una versión de Boost> = 1.37 si realizas esta ruta.