documentation for boost::asio::ssl::stream表示以下关于线程安全的内容:
线程安全
不同的物品:安全。
共享对象:不安全。应用程序还必须确保所有异步操作都在相同的隐式或显式链中执行。
如果我将其与documentation for the boost::asio::ip::tcp::socket type进行比较,则不包括关于股的声明。
问题
如果对流对象的访问是由互斥锁控制的,确保在给定时间只有一个线程在ssl流上运行,那么使用隐式/显式链的需要是什么?
此外,“异步操作”在这种情况下意味着什么?该文档是指调用例如boost :: asio :: async_read / boost :: asio :: async_read,还是调用我传递给这些操作的处理程序回调?
答案 0 :(得分:1)
如果对流对象的访问是由互斥锁控制的,确保在给定时间只有一个线程在ssl流上运行,那么使用隐式/显式链的需要是什么?
没有必要。互斥锁使操作序列化为“逻辑链”。 Asio的 strands 仅仅是一种在没有显式同步代码的情况下实现此类序列化的机制,以防您有多个运行io_service的服务
此外,“异步操作”在这种情况下意味着什么?文档是指调用例如boost :: asio :: async_read / boost :: asio :: async_read,还是调用我传递给这些操作的处理程序回调?
Boost指的是它实际上是那些成员函数/自由函数的实现,因为它们对非线程安全的服务对象进行操作。完成处理程序是你自己关注的问题:如果你使它们成为线程安全的,那么就不再需要完成任务了。请注意,您无法直接从这些“未序列化”的完成处理程序启动异步操作,从而导致代码如下:
void completionhandler(error_code const& ec) {
if (!ec) {
io_service_.post([] { boost::asio::async_...(...); });
// or:
strand_.post([] { boost::asio::async_...(...); });
}
}
这充分利用了strand
和io_service
个对象 线程安全的事实。