Asio中async_write的完成处理程序是否可能在调用线程返回前被调用?
Asio中async_write的完成处理程序是否可能在调用线程返回前被调用?
这个问题的核心其实是搞懂Asio里post和dispatch的区别,结合官方文档的描述就能明确结论。
首先先看你引用的官方文档内容:
If an asynchronous operation completes immediately (that is, within the thread of execution calling the initiating function, and before the initiating function returns), the completion handler shall be submitted for execution as if by performing ex2.post(std::move(f), alloc2). Otherwise, the completion handler shall be submitted for execution as if by performing ex2.dispatch(std::move(f), alloc2).
我先给你拆解下post和dispatch的关键差异:
dispatch:如果当前调用线程就是操作关联的事件循环线程(也就是你调用async_write的这个线程),它会同步立即执行提交的处理程序;如果当前不是事件循环线程,就会把处理程序放到事件循环的任务队列里,等后续轮询时执行。post:不管当前线程是不是事件循环线程,它都会把处理程序放到任务队列里,绝对不会立即执行——必须等当前正在运行的代码(也就是你的async_write调用逻辑)执行完毕,事件循环下次处理任务队列时才会触发这个处理程序。
现在结合这两个函数的行为分析async_write的两种情况:
- 异步操作立即完成:比如数据已经全部写入内核缓冲区,操作在调用
async_write的线程内就完成了。这时候文档明确说会用post提交完成处理程序,而post的特性决定了处理程序不会立即执行,必须等async_write返回后,事件循环再去处理队列里的任务时才会调用它。 - 异步操作未立即完成:这种情况下操作需要等待后续的IO事件触发完成,此时文档说用
dispatch提交,但这时候操作本身还没完成,处理程序要等IO完成后才会被提交,而async_write早就已经返回了,自然也不存在处理程序在async_write返回前被调用的情况。
所以结论很明确:你的完成处理程序绝对不会在async_write返回前被调用,完全满足你代码正确性的要求。
备注:内容来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

