gpt4 book ai didi

c++ - asio strand 对象线程安全吗?

转载 作者:行者123 更新时间:2023-12-01 14:47:36 25 4
gpt4 key购买 nike

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

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

最佳答案

是的。见 docs

Thread Safety

Distinct objects: Safe.

Shared objects: Safe.



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

此外, mutex on a strand 不可能工作,因为组合操作需要在线程上分派(dispatch)工作,并且他们不会意识到需要锁定。

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

关于c++ - asio strand 对象线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62372951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com