【问题标题】:Boost async sockets and thread pool on same io_service object在同一个 io_service 对象上提升异步套接字和线程池
【发布时间】:2015-03-15 12:39:32
【问题描述】:
我正在编写一个服务器应用程序。
- 对于多线程,我使用类似于this one 的线程池。
- 在网络接口中,我使用带有异步操作的套接字。
- 所有套接字和线程池使用相同的 io_service 对象。
我的问题是在多个套接字上执行async_read 操作“阻塞”线程池中的一个线程,还是它们启动了额外的线程,或者两者都不启动?
【问题讨论】:
标签:
c++
multithreading
sockets
boost
boost-asio
【解决方案1】:
两者都不是。每个async_read 操作最初由调用它的线程处理。如果在套接字未准备好的情况下无法向前推进(因为对方需要发送或接收某些东西),则异步操作返回到调用线程。套接字准备情况由“反应器”监控,这是 boost 的内部部分,它使用每个平台支持的最有效机制来监视套接字的准备情况。当套接字准备好并且操作可以向前进行时,将“组合操作”分派给 I/O 服务以继续操作。当操作完成时,完成它的线程调用完成处理程序。