2013-01-10 84 views
9

this blog我發現了一個非常簡潔的例子,就是如何使用boost :: asio創建一個簡單的線程池。基本上,我想用這樣的:使用boost :: asio線程池進行通用任務

#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是,據我所知,主要是針對網絡IO。不過,我主要是想將它用於通用功能。併發問題將使用asio::io_service::strand來解決。

所以我的問題:創建一個像這樣的線程池是一個好主意,即使我的程序不使用網絡IO?與其他線程池實現相比,是否有任何明顯的性能損失?如果是這樣,是否有更好的實現,也是一樣整潔?

+0

的boost ::線程支持的boost :: thread_group,你可以用它來組你的線程 – StereoMatching

回答

6

Boost.Asio的不僅僅是網絡編程,看到reference documentation。它有一個像

  • 基於時間的操作(deadline_timer
  • 信號處理,如POSIX流和Windows
  • 平臺的具體操作處理

我已經使用了其他的東西的廣泛支持在幾個應用中也是如此。一個例子是一個線程池,用於服務可能長時間運行的阻塞數據庫操作,同時爲應用程序提供一個異步接口Boost.Asio確實是一個非常強大的圖書館。按照您的建議將它用於通用線程池可以工作得很好。

3

我看不出有任何理由不這樣做事。作爲一個好處,你可以使用像boost :: asio之上構建的最後期限計時器之類的東西。