【问题标题】:io_context concurrency hint (BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO)io_context 并发提示 (BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO)
【发布时间】:2018-03-13 22:22:45
【问题描述】:

在查看 1.66.0 版本中 boost::asio 的文档时,我注意到 io_context 构造函数提供了一个 concurrency_hint 参数。阅读文档后,我不确定是否可以使用BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO

我有以下情况:

  • 我有一个io_context 来执行 IO。 ioc.run() 从单个线程执行。
  • 在此线程中,执行了一些使用异步调用的网络 IO。
  • 其他线程调用boost::asio::dispatch(ioc, ...)在IO线程上执行代码。

我正在尝试找出在上述情况下可以安全使用的 concurrency hint 值:

  • 不使用并发提示是可以的(例如BOOST_ASIO_CONCURRENCY_HINT_SAFE),但比使用提示要慢。
  • 使用1 没问题。
  • 使用BOOST_ASIO_CONCURRENCY_HINT_UNSAFE 不行,因为它不允许异步调用。

我不清楚的是BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO。文档说:

此特殊并发提示禁用反应器 I/O 中的锁定。该提示有以下限制:

— 必须注意确保 io_context 上的运行函数以及上下文相关 I/O 对象(例如套接字和计时器)上的所有操作一次仅在一个线程中发生。

我想知道在使用此并发提示时从另一个线程执行boost::asio::dispatch 是否安全。

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    由于boost::asio::dispatch¹ends up calling io_context::dispatch 我会得出结论,如果您从另一个线程调用BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO,则使用BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO不行

    — 必须注意确保 io_context 上的运行函数以及上下文相关 I/O 对象(例如套接字和计时器)上的所有操作一次仅在一个线程中发生。


    ¹发布/延迟相同

    【讨论】:

    • 我同意BOOST_ASIO_CONCURRENCY_HINT_UNSAFE 不能在这种情况下使用。但是,BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO 呢?在这种模式下会完成一些锁定,我认为文档不清楚是否允许调度。
    • 糟糕。我的意思是说BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO。固定
    猜你喜欢
    • 2021-12-23
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多