2013-11-14 43 views
1

我的問題是關於提升asio的io_service。 當我與該方法調用它:從線程池中調用時,boost的io_service共享線程是否爲請求?

int main() 
{ 
    try 
    { 
    boost::asio::io_service io_service; 
    Server server(io_service); 
    std::vector<boost::shared_ptr<boost::thread> > threads; 
    for (std::size_t i = 0; i < 16; ++i) 
    { 
     boost::shared_ptr<boost::thread> thread(new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service))); 
     threads.push_back(thread); 
    } 
    for (std::size_t i = 0; i < threads.size(); ++i) 
    threads[i]->join(); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << e.what() << std::endl; 
    } 

    return 0; 
} 

將它分享給請求的線程動態,或將只給只有一個線程用於連接組? 謝謝。

+0

您能否澄清當前上下文中的「請求」和「連接組」? –

+0

@IvanGrynko我的意思是請求處理程序處理接收到的數據包的服務器邏輯。每個調度連接信號的連接組意味着與反應堆模式1線程相似。 – user2971678

回答

2

asio::io_service有一個共享事件隊列。這些事件由當前正在調用io_service :: run()的線程處理。所以是的,可能會從不同的線程調用一個處理程序。

我不建議你爲你的服務器運行16個線程,因爲它給你一個減速(因爲上下文切換和boost::asio bottleneck)。如果你真的需要這麼多的線程,那麼更喜歡使用「每線程io_service」習語。

+0

我只是想爲每個核心設計做線程,但是我在老電腦服務器16個線程上添加了調試測試,以允許處理玩家。 即時通訊不知道每個線程的io服務是否會很好,因爲有人加入世界時會運行大的同步數據包,並會根本阻止io_service。 – user2971678

相關問題