[英]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.