如何解决如何正确存储和调用`boost :: asio`处理函数?
当前,我正在使用boost::asio
框架实现一些复杂的网络协议。该协议支持请求多路复用,因此我实现了全状态组合操作以提供高级访问。说,类似以下内容:
connection::async_request(Request req,Handler&& h);
该请求被允许同时运行,因此我必须在内部收集容器中所有待处理的完成处理程序,以便能够为每个请求调用适当的处理程序。不幸的是,boost::asio
Handler
不仅仅是Callable
,因此这里不能使用std::function<>
的容器。在AFAIU中,每个Handler
均由三个部分组成:
此外,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_read
与strand
对象一起使用,需要提供正确的实现。同时,传递给函数的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
开始新的合成异步操作,或将更多工作附加到已在进行的操作中。在后一种情况下,用户提供的新最终处理程序不会影响调用中间处理程序的方式(Executor
和Allocator
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。