2013-01-10 14 views
9

In this blog Ho trovato un esempio molto carino su come creare un pool di thread semplice utilizzando boost :: asio. Io fondamentalmente voglio usarlo in questo modo:Utilizzo di boost :: asio pool di thread per attività generiche

#include <thread> 
#include <functional> 
#include <boost/asio.hpp> 

int main (int argc, char* argv[]) { 
    asio::io_service io_service; 
    asio::io_service::work work(io_service); 

    std::vector<std::thread> threadPool; 

    for(size_t t = 0; t < std::thread::hardware_concurrency(); t++){ 
     threadPool.push_back(thread(std::bind(&asio::io_service::run, &io_service))); 
    } 

    io_service.post(std::bind(an_expensive_calculation, 42)); 
    io_service.post(std::bind(a_long_running_task, 123)); 

    //Do some things with the main thread 

    io_service.stop(); 
    for(std::thread& t : threadPool) { 
     t.join(); 
    } 
} 

boost :: ASIO è, per quanto ne so, realizzato principalmente per la rete IO. Tuttavia, voglio principalmente usarlo per funzioni generiche. I problemi relativi alla concorrenza verrebbero trattati utilizzando asio::io_service::strand.

Quindi la mia domanda: è una buona idea creare un pool di thread come questo, anche se il mio programma non utilizza l'IO di rete? Ci sono ovvie perdite di prestazioni rispetto ad altre implementazioni del pool di thread? Se è così, ci sono implementazioni migliori che sono altrettanto pulite?

+0

boost :: boost supporto thread :: thread_group, è possibile utilizzarlo per raggruppare il thread – StereoMatching

risposta

6

Boost.Asio non è solo per la programmazione di rete, vedere reference documentation. Ha un ampio supporto per cose come

  • operazioni di base di tempo (deadline_timer)
  • movimentazione
  • operazioni specifiche
  • piattaforma, come i flussi POSIX e di Windows segnale maniglie

ho usato per altri scopi in diverse applicazioni pure. Un esempio è un pool di thread per eseguire operazioni di blocco del database potenzialmente a esecuzione prolungata fornendo un'interfaccia asincrona per l'applicazione. Boost.Asio è davvero una libreria molto potente. Usarlo per un pool di thread generico come si propone può funzionare bene.

3

Non vedo alcuna ragione per non fare le cose in questo modo. Come vantaggio, puoi usare cose come i timer di scadenza che sono costruiti su boost :: asio.