当使用boost :: asio进行某些异步TCP通信时,我注意到它启动了很多(3-4)内部线程。阅读the documentation,它说
"The implementation of this library for a particular platform may
make use of one or more internal threads to emulate asynchronicity"
现在我的lib有非常严格的要求,不能启动任何额外的线程(除了客户端提供的线程,现在启动io_service::run()
)。有没有办法阻止boost :: asio创建这些额外的线程?
或者,是否还有其他只能在一个线程中运行的异步库?
答案 0 :(得分:6)
您可以通过在相应的翻译单元中定义BOOST_ASIO_DISABLE_THREADS
来禁用模拟的异步操作支持。 The documentation对定义
明确禁用Boost.Asio的线程 支持,无论Boost作为一个整体是否支持 线程。
如果您没有找到platform specific implementation notes,则会明确说明哪些操作使用此仿真。例如,我知道几乎每个平台async_resolve()
都以这种方式模拟,线程是在第一次调用async_resolve()
时创建的。一些(所有?)Windows平台模拟其他几个操作,例如deadline_timer
操作。
禁用线程支持的一种替代方法可能是避免这些模拟操作。我个人没有在项目中使用BOOST_ASIO_DISABLE_THREADS
所以我不确定它是否有其他副作用。
答案 1 :(得分:1)
您是否真的对其进行了测试,以确定是否在您的特定平台上生成了线程?如果没有,问题就解决了!如果有的话,你可以考虑使用像libevent或libev这样的不同库。其中任何一个,或Qt等各种库提供的一大堆其他异步事件循环都可以工作。