c++ multithreading boost threadpool boost-thread

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.



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.



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();


here se describe una implementación de ejemplo usando el marco ffead-cpp . Proporciona implementación directa, basada en prioridad y una agrupación de subprocesos programada. Echale un vistazo...