2016-06-14 70 views
-1

boost.asio是否對完成處理程序訂購提供任何保證?我已經啓動了一個async_read &單個async_write操作。我在內部使用epoll_reactor。如果套接字變成可同時可讀的&,那麼我的讀(或寫)操作以及因此完成處理程序將以特定的順序執行總是boost.asio:async_read/async_write完成處理程序訂購

目前,閱讀epoll_reactor.ipp:perform_io,似乎是這種情況。但ASIO文件是否能保證?

+1

它沒有記錄,所以我強烈建議不要依賴它。儘管如此,這應該不重要。到第一個處理程序事件發生時,第二個事件已經發布到io_service。沒有什麼可以阻止它被執行。 –

+0

此外,如果您有多個線程通過io_service運行,則兩個處理程序將同時執行。 –

+0

我沒有使用多個線程。無論如何感謝您的答案。我在文檔之後 – zrb

回答

0

沒有保證。另外,最好不要依賴任何這種「排序」的東西。這是競爭條件和其他錯誤的重要領域。

0

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),但爲了在這些執行不明確。也就是說,你無法說明是否發生了一件事。因此沒有訂單保證。