2013-11-14 45 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

相关问题