Boost Asio中多次调用async_read_some是否被禁止?
关于Boost Asio中多次调用
async_read_some的问题解答 好问题!咱们一步步来拆解你的疑问:
1. 多次调用async_read_some是否被禁止?
答案是完全允许,这和async_read的限制完全不同。
你提到的那个相似问题确实是针对async_read的——因为async_read是组合式操作,它会持续读取直到满足指定字节数或触发错误,多次提交会导致逻辑冲突,所以官方明确禁止这种行为。但async_read_some是基础异步读取操作,语义是“读取任意可用的字节(至少1字节,除非连接/设备关闭)”,不管是TCP套接字还是串口的async_read_some,官方文档都没有禁止多次提交这类异步操作。
2. 关于handler的执行顺序
你的假设完全正确!根据Boost Asio的Proactor模型行为,多次提交的async_read_some操作会按提交顺序进入内部队列:
- 当有数据就绪时,队列中最早提交的
async_read_some处理器会先被执行; - 每次非0字节的读取完成后,下一个排队的处理器会在下次数据就绪时被触发;
- 如果出现0字节读取(通常对应TCP连接关闭、串口断开等场景),对应的处理器会被触发并返回错误,后续排队的操作也会依次触发并返回相同错误。
额外注意事项
虽然允许多次提交async_read_some,但一定要保证每个异步操作对应的缓冲区在处理器执行完成前始终有效——比如不能用栈上的局部变量作为缓冲区,否则处理器触发时缓冲区可能已被销毁,会导致未定义行为。
内容的提问来源于stack exchange,提问作者Superlokkus
相关产品推荐
相关产品推荐

