2010-10-21 12 views
41

Che cosa è una buona implementazione open source di un pool di thread per C++ da utilizzare nel codice di produzione (qualcosa come boost)?Pool di thread C++

Fornire il proprio codice di esempio o un collegamento per l'utilizzo del codice di esempio.

+0

Qual è il problema con boost? –

+5

@David - non c'è un threadpool integrato in Boost, c'è? –

+0

@Steve Townsend: Giusto, scusa ... ho pensato di ricordarne uno in boost, ma non è realmente incluso (non è stato accettato). Ce n'è uno disponibile in http://threadpool.sourceforge.net/index.html –

risposta

21

Penso che non sia ancora accettato in Boost, ma un buon punto di partenza: threadpool. Alcuni esempi di utilizzo, dal sito 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'argomento "2" per il pool indica il numero di thread. In questo caso, la distruzione di tp attende la fine di tutti i thread.

+1

Qual è il significato di '2' nell'istruzione' pool tp (2); '? – Arun

+0

@ArunSaha: indica il numero di thread iniziali. Lo aggiungerò alla risposta. –

+0

Questo progetto di raccolta del pool di thread può fornire alcune idee. -> https://code.google.com/p/threadpool11/ – Etherealone

0

This library build su Boost.Thread. C'è un short tutorial con qualche codice di esempio. Se questo non fa ciò che vuoi, puoi usarlo come base.

Assicurati di essere su una versione Boost> = 1,37 se segui questo percorso.

3

Credo che si possa emulare un pool di thread con un io_service in boost :: asio. È possibile controllare il numero di thread disponibili per il pool io_service e quindi è possibile "postare" le attività su io_service, che verrà eseguito da uno dei thread nel pool. Ognuno di questi compiti deve essere un funtore (credo).

Non riesco a mettere un esempio qui adesso, ma la documentazione di asio sui pool io_service illustrerà come ciò può essere fatto.

0

Un'implementazione di esempio che utilizza il framework ffead-cpp è descritta here. Fornisce l'implementazione del pool di thread diretta, basata su priorità e programmata. Dai un'occhiata ...

7

Ho scritto un piccolo esempio here. Fondamentalmente quello che dovete fare è quello di attuare questo pezzo di codice:

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