在同一个链中执行异步操作

时间:2014-11-30 10:11:23

标签: c++ multithreading sockets asynchronous boost-asio

documentation for boost::asio::ssl::stream表示以下关于线程安全的内容:

线程安全

  • 不同的物品:安全。

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

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

问题

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

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

1 个答案:

答案 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_...(...); });
    }
}

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