簡體   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