簡體   English   中英

使用僅在單個線程中調用的io_service :: run()序列化io_service :: post()執行

[英]Serialize io_service::post() execution with io_service::run() called only in a single thread

如果我只在一個線程中運行io_service::run()io_service::post()調用是按照我請求它們執行的相同順序執行的,或者它們可以按任意順序執行,我仍然需要使用用於強制序列化執行的strand

之前已經處理過這個問題,例如

它清楚地說明了

如果滿足以下任一條件:

  • s.post(a)發生在s.post(b)之前s.post(b)
  • ...

然后asio_handler_invoke(a1, &a1)發生在asio_handler_invoke(b1, &b1)

請注意,單個IO線程會創建隱式鏈 (docs)


注意關於另一個答案:當在完成異步操作時隱式完成處理程序調用時,這當然不成立。

請注意,在以下情況中:

 async_op_1(..., s.wrap(a)); async_op_2(..., s.wrap(b)); 

第一個異步操作的完成將執行s.dispatch(a) ,第二個將執行s.dispatch(b) ,但未指定執行這些操作的順序。 也就是說,你無法說明一個是否發生在另一個之前 因此,不滿足上述條件,也不進行訂購保證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM