c++ - asiostrand对象线程安全吗?

标签 c++ boost-asio

我必须开发一个与服务器通信的异步客户端。客户端在与主应用程序不同的线程中运行,并且仅使用回调链读取服务器发送的内容。每个读取处理程序都通过一条链注册下一个读取处理程序(这有点复杂,因为我使用类方法作为回调,因此我需要绑定(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对象是否足够,或者是否有必要保留对原始对象的引用。在后一种情况下,我担心操作的线程安全性。 如果可能的话,我想避免在链对象上使用显式互斥体。

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

最佳答案

是的。请参阅docs

Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

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


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

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

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

相关文章:

使用模板的 C++ 方法定义

c++ - 在64位边界上对齐C++结构数组?

c++ - vector push_back 访问冲突

c++ - 尽管有工作对象,asio::io_service.run() 仍退出

c++ - 读/写超过 100000 条消息时提升 asio 错误

c++ - 使用命令行输入调用函数

c++ - Visual Studio,C++,在另一个 DLL 导出类中使用 DLL 导出类

c++ - GDB 断点在 asio socket->connect 调用后停止工作

c++ - 可以优化 lambda 按值捕获吗?

sockets - 绑定(bind)多播 (UDP) 套接字意味着什么?