微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确存储和调用`boost :: asio`处理函数?

如何解决如何正确存储和调用`boost :: asio`处理函数?

当前,我正在使用boost::asio框架实现一些复杂的网络协议。该协议支持请求多路复用,因此我实现了全状态组合操作以提供高级访问。说,类似以下内容

connection::async_request(Request req,Handler&& h);

该请求被允许同时运行,因此我必须在内部收集容器中所有待处理的完成处理程序,以便能够为每个请求调用适当的处理程序。不幸的是,boost::asio Handler不仅仅是Callable,因此这里不能使用std::function<>的容器。在AFAIU中,每个Handler均由三个部分组成:

  • 调用函数
  • 可选的关联执行程序Executor
  • 可选的关联分配器Allocator

此外,boost::asio::executor_work_guard<Executor>对象必须与Handler一起存储,以防止关联的Executor对象由于工作量不足而终止。 我在Boost.Asio库中找不到任何准备好的东西。我说的对吗?

我发现Boost.Beast库中有boost::beast::saved_handler,我想它是为解决同一类问题而设计的。但是,我看到saved_handler::invoke()被设计为普通的函数调用。据我了解,当与处理程序关联的执行程序与组合操作的内部处理程序的执行程序不同时,这可能会导致问题。所以这部分我还是不清楚。

组合操作Asio示例(cpp14/operations)继承了与处理程序关联的内部异步操作的分配器和执行器。相反,我的connection::async_request在内部将async_write / async_readstrand对象一起使用,需要提供正确的实现。同时,传递给函数Handler可以使用另一个strand,在编写操作期间一定不能丢失它。我是否正确理解,运行boost::asio::dispatch()调用存储处理程序的更正确方法?应该推荐什么方式来提供这种功能

更新: @sehe指向我的Reddit主题https://www.reddit.com/r/cpp/comments/6aygos/boostasio_asynchronous_composed_operation_tutorial/

我将用以下引用的线程来重新表达我的问题。 Asio对组合操作在内部的工作方式进行了以下假设:

当异步操作由其他异步操作组成时 操作,所有中间处理程序应使用相同的调用 方法作为最终处理程序。

这可能就是为什么在整个Internet上找到的所有示例中都将最终处理程序称为handler(...)的原因。 (可能包括beast::saved_handler实现)。

不幸的是,对我而言并非如此。 connection::async_request开始新的合成异步操作,或将更多工作附加到已在进行的操作中。在后一种情况下,用户提供的新最终处理程序不会影响调用中间处理程序的方式(ExecutorAllocator)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?