繁体   English   中英

从一个线程中提升asio - SSL async_read和async_write

[英]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_READSSL_ERROR_WANT_WRITE错误代码来表明它们的通信需求。 ssl::stream实现使用这些错误代码来异步调度网络操作。 ssl::stream读或写操作可能需要在底层网络套接字上进行多次读取和写入操作,并且需要多次调用SSL_read() / SSL_write() ,这将从异步网络操作完成处理程序执行(特别是不从原始的async_read / async_write调用),这就是为什么不能确保不同时调用async_readasync_write ,而是需要一个strand。

这很安全。 但是在同一个套接字上模拟2个或更多async_write -s是不安全的,并且经常会出现段错误(至少对于SSL情况而言)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM