io_service::run()处理async_*函数的顺序
io_service::run() processing order of async_* functions
假设在调用io_service::run()时,计划了多个async_read操作(它们之间可能还有其他操作)。当在ReadHandler函数中调度异步操作(如async_write)时会发生什么?
void handler(const boost::system::error_code& error, std::size_t bytes) {
async_write(sock, boost::asio::buffer(wbuf), whandler);
}
也就是说,什么时候会调用async_write?我预计执行顺序是:
1) async_read //1
2) async_write
3) async_read //2
4) async_write
这个执行顺序有保证吗?
不,不能保证。例如,如果第一个处理程序被调用并想要写入,那么如果第二个缓冲区还不能读取呢?当然,写作应该放在第一位。但是,如果在第二个缓冲区准备好读取时无法进行写入,该怎么办?当然,第二次读取应该发生在第一次写入之前。
您滥用了boost::asio
接口。
一个套接字上可能没有多个挂起的读取操作。
引用boost::asio::async_read
文档:
此操作是根据对stream的async_read_some函数,并且被称为composed活动程序必须确保流不执行其他操作读取操作(如async_read、流的async_read_some函数或执行读取的任何其他组合操作),直到此操作完成。
您可以使用strand
的强制执行顺序
- http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/reference/io_service__strand.html
这里有一个很好的描述:为什么在使用boost::asio时,我需要每个连接一条
相关文章:
- 为什么std::async使用同一个线程运行函数
- 为什么我不能将引用作为 std::async 的函数参数传递
- async中没有匹配的函数(模板中未解析的类型)
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- C++从 std::async 函数读取命名空间中的全局变量标志
- 如何将函数及其参数传递给成员函数内的 std::async
- 使用 std::async 调用模板函数的正确方法是什么?
- 为什么不能将std :: async用于接收对抽象类作为参数的函数
- 没有与参数列表匹配的重载函数"async"实例
- 通过 std::async 启动的函数引发的异常会发生什么情况
- 如何在成员函数上使用 std::async
- std::async 和 lambda 函数在C++中没有给出关联的状态
- 如何使用“std::async”在互斥锁保护循环中调用函数
- 如何将函数参数传递给boost::async()
- std::async, std::函数对象和带有'callable'参数的模板
- std::async 可以与模板函数一起使用吗?
- 如何为返回async结果的函数指定函数签名
- 将std::async与模板函数结合使用
- 用std::async调用带unique_ptr类型的函数
- 在clang中使用std::async的模板函数