Pool di thread C ++

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

Fornisci il tuo codice di esempio o un link per l’utilizzo del codice di esempio.

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 che tutti i thread finiscano.

Potresti voler dare un’occhiata a http://threadpool.sourceforge.net/

Non è difficile implementare il pool di thread da solo con Boost.Thread . A seconda dell’attività, è ansible utilizzare un contenitore senza blocco per la coda anziché uno dalla libreria di modelli standard . Ad esempio, fifo container dalla libreria lock free .

In bocca al lupo!

Ho scritto un piccolo esempio qui . Fondamentalmente quello che devi fare è implementare questo pezzo di codice:

 asio::io_service io_service; boost::thread_group threads; auto_ptr 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::iterator it=tasks.begin();it!=tasks.end();it++){ io_service.dispatch(/* YOUR operator()() here */); } work.reset(); 

Credo che sia ansible emulare un pool di thread con un io_service in boost :: asio. È ansible controllare il numero di thread disponibili per il pool io_service e quindi è ansible “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 posso fare un esempio qui adesso, ma la documentazione di asio sui pool io_service illustrerà come ciò può essere fatto.

Ecco una semplice coda delle attività di solo header usando un pool di thread (costruito su Boost): taskqueue.hpp

La pagina del progetto TaskQueue include un’applicazione di esempio che dimostra come utilizzarla :

Questa libreria si basa su Boost.Thread. C’è un breve tutorial con qualche codice di esempio. Se questo non fa ciò che vuoi, puoi usarlo come base.

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

Un’implementazione di esempio che utilizza il framework ffead-cpp è descritta qui . Fornisce l’implementazione del pool di thread diretta, basata su priorità e programmata. Controlla…