2010-10-21 9 views
41

¿Qué es una buena implementación de código abierto de un grupo de subprocesos para que C++ use en el código de producción (algo así como aumentar)?Grupo de subprocesos de C++

Proporcione su propio código de ejemplo o un enlace al uso de código de ejemplo.

+0

¿Cuál es el problema con el impulso? –

+5

@David: no hay subprocesos de subprocesos integrados en Boost, ¿verdad? –

+0

@Steve Townsend: Correcto, lo siento ... pensé que recuerdo uno en boost, pero en realidad no está incluido (no se ha aceptado). Hay uno disponible en http://threadpool.sourceforge.net/index.html –

Respuesta

21

Creo que todavía no se acepta en Boost, pero es un buen punto de partida: 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" al grupo indica el número de subprocesos. En este caso, la destrucción de tp espera a que finalicen todos los hilos.

+1

¿Cuál es el significado de '2' en la declaración' pool tp (2); '? – Arun

+0

@ArunSaha: indica el número de subprocesos iniciales. Lo agregaré a la respuesta. –

+0

Este proyecto de biblioteca de agrupamiento de subprocesos puede dar algunas ideas. -> https://code.google.com/p/threadpool11/ – Etherealone

0

This library se basa en Boost.Thread. Hay un short tutorial con algún código de ejemplo. Si esto no hace lo que desea, puede usarlo como línea de base.

Asegúrese de tener una versión de Boost> = 1.37 si sigue esta ruta.

3

Creo que puede 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 los grupos io_service describirá cómo se puede hacer esto.

0

Se describe una implementación de ejemplo utilizando el marco ffead-cpphere. Proporciona implementación directa, basada en prioridad y una agrupación de subprocesos programada. Verifíquelo ...

7

He escrito un pequeño ejemplo here. Básicamente lo que hay que hacer es poner en práctica este pedazo 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(); 
Cuestiones relacionadas