使用仅在单个线程中调用的io_service :: run()序列化io_service :: post()执行

时间:2015-07-20 22:09:52

标签: c++ boost-asio

如果io_service::run()只在一个线程中运行io_service::post()调用是按照我请求执行的相同顺序执行的,或者它们可以在任意顺序,我仍然需要使用strand强制序列化执行?

1 个答案:

答案 0 :(得分:3)

此问题已经过处理过,例如

它清楚地说明了

  

如果满足以下任一条件:

     
      
  • s.post(a)发生在[{1}}
  • 之前   
  • ...
  •   
     

然后s.post(b)发生在asio_handler_invoke(a1, &a1)之前。

请注意,单个IO线程会创建隐式链(docs)

注意关于另一个答案:当然,在完成异步操作时隐式完成处理程序调用时,这不会成立。

  

请注意,在以下情况中:

asio_handler_invoke(b1, &b1)
     

第一次异步操作的完成将执行async_op_1(..., s.wrap(a)); async_op_2(..., s.wrap(b)); ,和    第二个将执行s.dispatch(a),但它们的顺序    执行是未指定的。也就是说,你无法说明是否一个    发生在之前。因此,没有满足上述条件    没有订购保证。