boost.asio是否對完成處理程序訂購提供任何保證?我已經啓動了一個async_read &單個async_write操作。我在內部使用epoll_reactor。如果套接字變成可同時可讀的&,那麼我的讀(或寫)操作以及因此完成處理程序將以特定的順序執行總是boost.asio:async_read/async_write完成處理程序訂購
目前,閱讀epoll_reactor.ipp:perform_io,似乎是這種情況。但ASIO文件是否能保證?
boost.asio是否對完成處理程序訂購提供任何保證?我已經啓動了一個async_read &單個async_write操作。我在內部使用epoll_reactor。如果套接字變成可同時可讀的&,那麼我的讀(或寫)操作以及因此完成處理程序將以特定的順序執行總是boost.asio:async_read/async_write完成處理程序訂購
目前,閱讀epoll_reactor.ipp:perform_io,似乎是這種情況。但ASIO文件是否能保證?
沒有保證。另外,最好不要依賴任何這種「排序」的東西。這是競爭條件和其他錯誤的重要領域。
Boost.Asio不提供關於完成處理程序將被調用的順序的保證。
io_service
目前對處理程序的調用順序沒有任何保證。因此,io_service
可以自由選擇任意順序,即使已知底層反應器實現以已知順序執行操作和完成後處理程序。目前,只有strand
指定了發佈的處理程序執行順序的保證,並且它明確指出完成處理程序的順序未指定。處理程序調用的
訂購
考慮:
- 一個鏈對象
s
- 對象
a
會議完成處理要求- 對象
b
會議完成處理要求...
注意,在下面的情況:
async_op_1(..., s.wrap(a)); async_op_2(..., s.wrap(b));
第一異步操作的完成將執行
s.dispatch(a)
,第二個將執行s.dispatch(b)
,但爲了在這些執行不明確。也就是說,你無法說明是否發生了一件事。因此沒有訂單保證。
它沒有記錄,所以我強烈建議不要依賴它。儘管如此,這應該不重要。到第一個處理程序事件發生時,第二個事件已經發布到io_service。沒有什麼可以阻止它被執行。 –
此外,如果您有多個線程通過io_service運行,則兩個處理程序將同時執行。 –
我沒有使用多個線程。無論如何感謝您的答案。我在文檔之後 – zrb