boost :: asio内部线程

Rol*_*lle 4 c++ boost tcp boost-asio

当使用boost :: asio进行一些异步TCP通信时,我注意到它启动了很多(3-4)内部线程.它说,阅读文档

"The implementation of this library for a particular platform may 
 make use of one or more internal threads to emulate asynchronicity"
Run Code Online (Sandbox Code Playgroud)

现在我的lib有非常严格的要求,不能启动任何额外的线程(除了客户端提供的并且现在启动的线程io_service::run()).有没有办法阻止boost :: asio创建这些额外的线程?

或者,是否有任何其他异步库可以只在一个线程中运行?

Sam*_*ler 6

您可以通过BOOST_ASIO_DISABLE_THREADS在适当的转换单元中定义来禁用模拟的异步操作支持.文档中有关于定义的说法

显式禁用Boost.Asio的线程支持,不管Boost作为一个整体是否支持线程.

如果您没有找到特定平台的实现说明,则会明确说明哪些操作使用此仿真.例如,我知道几乎每个平台async_resolve()都以这种方式模拟,线程是在第一次调用时创建的async_resolve().一些(所有?)Windows平台模拟其他几个操作,例如deadline_timer操作.

禁用线程支持的一种替代方法可能是避免这些模拟操作.我个人没有BOOST_ASIO_DISABLE_THREADS在项目中使用,所以我不确定它是否有其他副作用.

  • 当定义`BOOST_ASIO_DISABLE_THREADS`时,Asio在尝试生成线程时抛出`boost :: asio :: error :: operation_not_supported`错误.因此,唯一的选择是避免线程产生操作.在大多数实现中,这可以通过使用`resolve()`而不是`async_resolve()`来完成.在Windows上,定义`BOOST_ASIO_DISABLE_IOCP`将导致Asio使用基于选择的实现,该实现较慢但不应产生其他线程. (3认同)