gpt4 book ai didi

c++ - io_service 如何将完成事件与完成处理程序匹配

转载 作者:行者123 更新时间:2023-11-28 05:03:55 25 4
gpt4 key购买 nike

我一直在阅读 boost asio 文档,特别是关于 Proactor 设计的。

当我看到这个标题的时候

前摄器设计模式:无线程的并发

我的理解是,asio 的用户不需要创建额外的线程来执行异步 IO,因为在这种模式下线程已经以异步操作处理器的形式盛行。

所以只是为了确认 io_service 将充当 proactor(获取完成事件并将其分派(dispatch)给完成处理程序)

无论何时启动异步进程,它都会由后台线程处理。

socket.async_connect(server_endpoint, your_completion_handler);

下面的顺序正确吗?

1) 连接操作将由线程处理。

2) Completion_handler 将被插入某个队列(或任何 DS)?

3) 一旦 async_connect 完成,它的结果/错误代码将被放入完成事件队列中。

4) proactor(io_service?)fetch 完成事件将其映射到处理程序

我只是想知道这个映射是如何完成的,因为异步操作处理器是由线程组成的(不是吗?)首先完成的任何事情都会触发完成事件以及 io_service将知道应该为这个事件调用哪个完成处理程序以及为那个事件调用哪个完成处理程序(我想研究实现,但对我来说现在似乎有点沉重。)

最佳答案

io_service 基本上是一个函数队列。当您实例化您的 socket 时,您将 io_service 的引用传递给它。现在,当您调用电话时:

socket.async_connect(server_endpoint, your_completion_handler);

您正在启动一个异步操作,其中 ASIO 将一个同步函数推送到 io_service,这是您的函数队列。 ASIO 推送到 io_service 的函数包含您的处理程序。时间到了,io_service 从队列中弹出一个元素(一个函数)并为您执行操作,最后使用该操作的结果调用您的处理程序。

关于队列的更多信息:如果您在一个线程中启动 io_service 对象(使用 io_service::run()),那么您将拥有一个真正的串行队列,其中一切都按顺序执行。另一方面,如果您在多个线程上调用 io_service::run(),队列将分布在这些线程上。使用 ASIO 的 strand 可以实现非阻塞线程安全。

关于c++ - io_service 如何将完成事件与完成处理程序匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45278796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com