gpt4 book ai didi

c++ - 在同一链中执行异步操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:23 29 4
gpt4 key购买 nike

documentation for boost::asio::ssl::stream关于线程安全声明如下:

线程安全

  • 不同的对象:安全。

  • 共享对象:不安全。应用程序还必须确保所有异步操作都在同一个隐式或显式链中执行。

如果我将其与 documentation for the boost::asio::ip::tcp::socket type 进行比较,则不包括关于股的陈述。

问题

如果对流对象的访问由互斥锁控制,确保在给定时间只有一个线程在 ssl 流上运行,那么使用隐式/显式链的必要性是什么?

此外,“异步操作”在这种情况下是什么意思?该文档是指对例如 boost::asio::async_read/boost::asio::async_read 的调用,还是我传递给这些操作的处理程序回调?

最佳答案

If access to the stream object is controlled by a mutex, making sure that only one thread operates on the ssl stream at a given time, what is the need for using an implicit/explicit strand?

那就没必要了。互斥锁使操作序列化为“逻辑链”。 Asio 的 strands 只是一种无需显式同步代码即可实现这种序列化的机制,以防您有多个服务运行 io_service

Also, what does "asynchronous operations" mean in this context? Is the document referring to calls to for example boost::asio::async_read/boost::asio::async_read, or to the handler callbacks I pass to these operations?

Boost 实际上指的是这些成员函数/自由函数的实现,因为它们对非线程安全的服务对象进行操作。完成处理程序是您自己关心的:如果您使它们成为线程安全的,那么实际上就不再需要 strands 了。请注意,您不能直接从此类“非序列化”完成处理程序启动异步操作,这会导致代码如下:

void completionhandler(error_code const& ec) { 
if (!ec) {
io_service_.post([] { boost::asio::async_...(...); });
// or:
strand_.post([] { boost::asio::async_...(...); });
}
}

这利用了 strandio_service 对象线程安全的事实。

关于c++ - 在同一链中执行异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212123/

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