2013-01-10 7 views
9

In this blog fand ich ein ziemlich nettes Beispiel, wie man einen einfachen Thread-Pool mit boost :: asio erstellt. Ich möchte im Grunde ist es wie folgt verwenden:Verwendung von boost :: asio Threadpool für allgemeine Aufgaben

#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 ist, soweit ich weiß, in erster Linie für Netzwerk-IO gemacht. Allerdings möchte ich es hauptsächlich für allgemeine Zwecke verwenden. Concurrency-Probleme würden mit asio::io_service::strand adressiert werden.

Also meine Frage: Ist es eine gute Idee, einen Thread-Pool so zu erstellen, auch wenn mein Programm nicht Netzwerk-IO verwendet? Gibt es offensichtliche Leistungseinbußen im Vergleich zu anderen Threadpoolimplementierungen? Wenn ja, gibt es bessere Implementierungen, die auch so sauber sind?

+0

boost :: thread support boost :: thread_group, Sie könnten damit Ihren Thread gruppieren – StereoMatching

Antwort

6

Boost.Asio ist nicht nur für die Netzwerkprogrammierung gedacht, siehe reference documentation. Es verfügt über umfangreiche Unterstützung für Dinge wie

  • Zeit basierte Operationen (deadline_timer)
  • Signal
  • plattformspezifische Operationen wie Posix-Streams und Windows behandelt

Umgang ich es auch für andere verwendet haben Zwecke auch in mehreren Anwendungen. Ein Beispiel ist ein Thread-Pool, der potenziell lange laufende blockierende Datenbankoperationen bedient, während eine asynchrone Schnittstelle für die Anwendung bereitgestellt wird. Boost.Asio ist wirklich eine sehr mächtige Bibliothek. Wenn Sie es für einen allgemeinen Thread-Pool verwenden, wie Sie vorschlagen, kann es gut funktionieren.

3

Ich sehe keinen Grund, die Dinge nicht so zu machen. Als Vorteil können Sie Dinge wie Deadline-Timer nutzen, die auf boost :: asio aufbauen.

2

Ich schrieb eine ThreadPool Klasse mit Boost Asio. Es funktioniert und es ist sauber & klar genug, um leicht zu verstehen. ThreadPool with boost asio