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

kag*_*san 3 c++ boost boost-asio

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

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

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

Tan*_*ury 7

Boost.Asio没有提供与libevent 事件相当的东西.

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

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

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

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

源图像和一般细节可以在这里找到.