5

当使用 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"

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

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

4

2 回答 2

7

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

显式禁用 Boost.Asio 的线程支持,与 Boost 作为一个整体是否支持线程无关。

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

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

于 2013-02-20T15:15:52.063 回答
1

您是否实际测试过它是否在您的特定平台上产生了线程?如果没有,问题就解决了!如果有的话,您可能会考虑使用不同的库,例如 libevent 或 libev。其中任何一个,或者由 Qt 等各种库提供的一大堆其他异步事件循环都可以工作。

于 2013-02-20T13:59:57.540 回答