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?
boost :: thread support boost :: thread_group, Sie könnten damit Ihren Thread gruppieren – StereoMatching