[英]Boost.asio: can I do async_read and async_write simultaneously from one thread?
[英]boost asio - SSL async_read and async_write from one thread
我知道OpenSSL,boost asio SSL实现是基于的,不允许并发SSL_read()和SSL_write()(即SSL_read()和SSL_write()由不同的线程执行)。
从同一个线程调用SSL套接字上的boost asio async_read()和async_write()是否安全?
谢谢
boost::asio::ssl:::stream
是为了线程安全; 它没有要求哪个线程可以启动操作:
不同的对象:安全。
共享对象:不安全。 应用程序还必须确保所有异步操作都在同一个隐式或显式链中执行。
如果应用程序只有一个线程处理io_service
,并且async_read()
和async_write()
是从该线程内启动的,那么它是安全的,因为操作和完成处理程序在隐式链中运行。
另一方面,如果多个线程正在处理io_service
,则需要显式strand
。 async_read()
和async_write()
操作需要从一个strand
启动,而完成处理程序需要由同一个strand
包装。
有关Boost.Asio的线程安全要求, strands
和组合操作的更多详细信息,请考虑阅读此答案。
从同一个线程调用 SSL套接字上的async_read()
和async_write()
是安全的,但在一般情况下, 它不足以避免ssl :: stream的并发问题。 实际要求在ssl::stream
文档中提供 :
线程安全(...)共享对象:不安全。 应用程序还必须确保所有异步操作都在同一个隐式或显式链中执行。
当然,标准的boost :: asio要求确保:
async_read
处理程序之前, async_read
执行任何其他读取操作 async_write
处理程序之前,不会执行任何其他写操作。 也必须得到满足。
注意,允许在写操作正在进行时调度读操作,反之亦然。 由于通过BIO
机制异步处理OpenSSL的网络需求,因此可以在ssl::stream
同时进行异步读写操作。 SSL_read()
和SSL_write()
通过返回SSL_ERROR_WANT_READ
和SSL_ERROR_WANT_WRITE
错误代码来表明它们的通信需求。 ssl::stream
实现使用这些错误代码来异步调度网络操作。 对ssl::stream
读或写操作可能需要在底层网络套接字上进行多次读取和写入操作,并且需要多次调用SSL_read()
/ SSL_write()
,这将从异步网络操作完成处理程序执行(特别是不从原始的async_read
/ async_write
调用),这就是为什么不能确保不同时调用async_read
和async_write
,而是需要一个strand。
这很安全。 但是在同一个套接字上模拟2个或更多async_write
-s是不安全的,并且经常会出现段错误(至少对于SSL情况而言)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.