【问题标题】:Is the asio strand object thread safe?asio strand 对象线程安全吗?
【发布时间】:2020-10-03 23:07:38
【问题描述】:

我必须开发一个与服务器对话的异步客户端。客户端在与主应用程序不同的线程中运行,并且只使用回调链读取服务器发送的内容。每个读取处理程序通过一个链注册下一个(它有点复杂,因为我使用类方法作为回调,所以我需要绑定 *this 以匹配处理程序的签名):

_socketObject.async_read_some(
        asio::buffer(_recv_buf.data(),_recv_buf.size()),
        asio::bind_executor(_strand, std::bind(
            &Connection::_handleRead, shared_from_this(),
            std::placeholders::_1, std::placeholders::_2)));

要写入服务器,我希望主应用程序通过同一链发布 (https://think-async.com/Asio/asio-1.16.1/doc/asio/reference/post/overload2.html) 执行写入服务器的回调(这是为了避免并发访问套接字和一些共享数据) .

我想知道的是复制客户端中使用的 strand 对象是否足够,或者是否有必要保留对原始对象的引用。在后一种情况下,我担心操作的线程安全。 如果可能,我想避免在 strand 对象上使用显式互斥锁。

我使用库的仅标头版本(非 Boost)。

【问题讨论】:

    标签: c++ boost-asio


    【解决方案1】:

    是的。见docs

    线程安全

    不同的对象:安全。

    共享对象:安全。

    可以复制链。事实上,您可以从另一个执行器创建一个新链,如果它在一个链上,它将最终代表相同的链标识。


    此外,链上的mutex 不可能工作,因为组合操作需要在线程上分派工作,并且它们不会意识到需要锁定。

    一般来说,锁定是异步任务中的禁忌:Strands: Use Threads Without Explicit Locking

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多