The documentation for ssl::stream says: "Shared objects: Unsafe. The application must also ensure that all asynchronous operations are performed within the same implicit or explicit strand." Does this mean we have to wait for an async operation to finish before another is started (for read/read, read/write, and write/write)? (Async operations refer to async_read_some() and async_write_some(), not the composed operations.) If so, is the operation said to have finished when the handler is invoked or when the handler returns? That is: void handler( const boost::system::error_code& error, std::size_t bytes_transferred ) { // Does the operation finish here ... } // or here? If not, what's the difference between the async operations of ip::tcp::socket and ssl::stream then (as strand just avoids concurrency for the thread-unsafe)? I came across different views on this problem. This answer[1] suggests that simply using the same strand (ie. no concurrency) will suffice. Another one[2] says multiple pending asynchronous operations can be problematic for ssl::stream even if no concurrency occurs. Thanks. [1] https://stackoverflow.com/questions/27212123/executing-asynchronous-operatio... [2] https://stackoverflow.com/questions/15352472/using-boosts-ssl-asio-code-asyn...