boost::asio::bind_executor() 行为,是有意的吗?
boost::asio::bind_executor() behavior, is it intended?
我想在一个io_context中运行服务,并在另一个io_context中执行业务逻辑。但首先我想更多地了解重新调度行为,所以我写了一些实验性代码。这是我的第一个版本(不使用 boost::asio::bind_executor(((
boost::asio::io_context context1;
boost::asio::io_context context2;
// for simplicity I use post here, it will be socket operation in real code
boost::asio::post(context1, [&context2]()
{ boost::asio::post(context2, []() { printf("job finished"); }); });
// notice I didn't run context1 here
context2.run();
上下文1 未运行,在本例中,没有作业发布到上下文 2。所以 context2.run(( 立即返回。当然,屏幕上没有打印任何东西。
然后这是使用boost::asio::bind_executor((的第二个版本
boost::asio::io_context context1;
boost::asio::io_context context2;
boost::asio::post(context1, boost::asio::bind_executor(context2, []()
{ printf("job finished"); }));
// notice I didn't run context1 here
context2.run();
在这种情况下,进程永远卡在 context2.run(( 中,等待挂起的作业被交付。
所以手写的包装代码和 boost::asio::bind_executor(( 的行为不同。是错误还是故意的?哪一种是建议的方式?
提前致谢
在第二个示例中,您将要执行的函数发布到 context1(该函数未运行(,但将完成处理程序绑定到 conext2 的执行器。这意味着:
context1- 的异步操作处理器未执行该函数,因为 context1 未运行。
- context2 的异步事件解复用器等待事件在完成事件队列上发生,因此会阻止完成处理程序到 printf。这是因为它绑定到从队列中取消事件或结果的排队,并将其与完成处理程序相关联。
在第一个示例中,context2 的帖子位于 context1 的完成处理程序内,由于 context1 未运行,因此 context1 的异步操作处理器从未执行,因此,context1 的异步事件解复用器无需等待。尔格快速返回。
速推文档
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 提升 ASIO 无法识别计时器对象
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- Boost.Asio:不能使用 std::bind() 来指定回调
- 将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 时出错?
- Boost Asio - boost::bind 导致程序崩溃
- boost::bind with member functions(作为boost::asio异步写入处理程序)
- Boost::asio 和 boost::bind:函子内存永远不会释放
- 为什么boost::asio::io_service不使用std::bind编译
- boost:asio:read_until问题与boost::bind有关
- std::bind() 错误:无法确定重载函数"boost::asio::io_service::run"的哪个实例
- 为什么 std::bind 和 boost::bind 不能在这个 Boost.Asio 教程中互换使用
- std::bind应该与boost::asio兼容吗
- Std::bind在boost::asio::ip::tcp::resolver上失败
- 为什么这个ASIO示例使用成员变量来传递状态,而不是使用bind ?
- BOOST ASIO:为什么我不在Windows中得到"bind: Address already in use"(但在Linux中得到它)?
- 处理指向模板中成员的指针,同时创建用于asio的更简单的' bind '
- boost::绑定端点时出现asio-bind异常