【问题标题】:boost::asio internal threadsboost::asio 内部线程
【发布时间】:2013-02-05 12:56:32
【问题描述】:

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

现在我的库有非常严格的要求,不能启动任何额外的线程(客户端提供的线程除外,现在启动io_service::run())。有什么方法可以阻止 boost::asio 创建这些额外的线程?

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

【问题讨论】:

    标签: c++ boost tcp boost-asio


    【解决方案1】:

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

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

    如果您没有找到platform specific implementation notes,它会明确说明哪些操作使用此仿真。例如,我知道几乎每个平台上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 使用基于选择的实现,该实现速度较慢,但​​不应产生额外的线程。
    • 谢谢,确实我根本没有找到这个文档。我将尝试使用 DISABLE_IOCP
    【解决方案2】:

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

    【讨论】:

    • 是的,我已经看到它们生成了。这个库也被移植到许多平台
    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2016-10-24
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2012-08-26
    相关资源
    最近更新 更多