asio链对象线程安全吗?

时间:2020-06-14 13:08:39

标签: c++ boost-asio

我必须开发一个与服务器通信的异步客户端。客户端在与主应用程序不同的线程中运行,并且仅使用回调链读取服务器发送的内容。每个读取处理程序都通过一个子句注册下一个(这有点复杂,因为我使用类方法作为回调,所以我需要绑定* 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对象上使用显式互斥。

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

1 个答案:

答案 0 :(得分:2)

是的。参见docs

线程安全

不同的对象:安全。

共享对象:安全。

可以复制子线。实际上,您可以在另一个执行程序上创建一个新链,如果该新链在一个链上,则最终将代表相同的链标识。


另外,在子网上的mutex可能无法工作,因为组合操作需要在线程上分派工作,并且他们不会意识到需要锁定。

通常,在异步任务中锁定是不可取的:Strands: Use Threads Without Explicit Locking

相关问题