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

时间:2014-05-05 14:01:43

标签: c++ boost boost-asio

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

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

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

1 个答案:

答案 0 :(得分:7)

Boost.Asio没有提供与libevent events等效的等价物。

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

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

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

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

源图像和一般细节可以找到here