gpt4 book ai didi

c++ - 从 libevent 移植到 boost::asio:什么是 ASIO 中 libevent 事件的直接等价物?

转载 作者:太空狗 更新时间:2023-10-29 20:13:06 29 4
gpt4 key购买 nike

我正在尝试向后移植基于 libevent 的库以使用 ASIO 后端(从而避免在单个应用程序中出现多个事件循环)。还有其他方法可以解决“问题”,但我对这个感兴趣

我在 Boost::ASIO 文档中没有看到 event 对象的直接等价物(或者更确切地说,是一个句柄——因为 libevent 是用纯 C 语言编写的); boost::asio::strand 看起来很熟悉,但它似乎并不遵循 libevent 的模式:创建、期望、接收、工作{、重复}。

我需要的是一组对象/事件/事件回调,它们可以被创建和遗忘,除非回调(通过套接字事件)发生,运行在 io_service 的循环之上; Boost 中有类似的东西吗?

最佳答案

Boost.Asio 不提供与 libevent 的 events 等效的功能.

在 Boost.Asio 中,创建一个 I/O 对象,例如 socket (1).然后程序将启动一个操作,例如 socket.async_receive(buffer, &handler) (2) 表明它希望数据从套接字读入buffer , 并调用 handler读取数据后。此步骤类似于在 libevent 中创建非持久性 pending 事件,但一个关键区别在于 Boost.Asio 的 Proactor将从套接字中读取数据到buffer代表用户,而不是通知用户数据可供读取。最后,Boost.Asio 将请求转发给操作系统 (3)。

然后操作系统会通知io_service该数据可用于以类似于 libevent 事件变为事件时的方式读取 (4)。在某些时候,应用程序将通过 io_service::run() 处理事件循环。 (5),就像对 libevent 的 event_base_loop() 所做的一样.当数据可供读取时,Boost.Asio 将从套接字中读取数据到 buffer。 ,然后将用户的回调 ( handler ) 发布到准备调用的回调队列中 (6)。然后,应用程序将在处理事件循环时调用回调。

Boost.Asio 非常关注 I/O 对象而不是操作:

  • 每次应用程序有兴趣处理 I/O 对象上的事件时,都必须启动一个操作。在这方面,整个流程类似于仅使用非持久性事件的 libevent 程序。
  • 操作无法识别。 Boost.Asio 不提供 libevent 为操作提供的相同级别的控制。例如,如果应用程序在套接字上有一个pending 读事件和一个pending 写事件,libevent 允许通过event_free() 删除写事件。不影响读取事件。另一方面,由于在 Boost.Asio 中无法识别操作,因此只能取消所有未决操作,例如通过 socket.cancel() 。 ,而不是能够取消特定操作,例如写入但不能读取。

源图像和一般详细信息可以位于 here .

关于c++ - 从 libevent 移植到 boost::asio:什么是 ASIO 中 libevent 事件的直接等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23474424/

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