我正在尝试向基于libevent的库反向移植以使用ASIO后端(从而避免在单个应用程序中出现多个事件循环)。还有其他方法可以解决“问题”,但我对这个问题感兴趣
我没有在Boost :: ASIO文档中看到直接等价的event
对象(或者更确切地说,是一个句柄 - 因为libevent是用纯C编写的); boost :: asio :: strand看起来很熟悉,但似乎并不遵循libevent的模式:创建,期望,接收,做工作{,重复}。
我需要的是拥有一组对象/事件/事件回调,除非在io_service
的循环上运行回调(通过套接字事件),否则可以创建和忘记回调。在Boost中有类似的东西吗?
答案 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对象而不是操作:
event_free()
删除写入事件,而不会影响读事件。另一方面,由于Boost.Asio中无法识别操作,因此只能取消所有待处理操作,例如通过socket.cancel()
,而不是取消特定操作,例如写入但不能读取源图像和一般细节可以找到here。