kag*_*san 3 c++ boost boost-asio
我正在尝试向基于libevent的库反向移植以使用ASIO后端(从而在单个应用程序中避免多个事件循环).还有其他方法可以解决"问题",但我对此感兴趣
我没有event在Boost :: ASIO文档中看到对象的直接等价物(或者更确切地说,是一个句柄 - 因为libevent是用纯C编写的); boost :: asio :: strand看起来很熟悉,但它似乎没有遵循libevent的模式:创建,期望,接收,做工作{,重复}.
我需要的是拥有一组对象/事件/事件回调,除非回调(通过套接字事件)发生,否则可以创建和忘记回调,运行在io_service循环之上; Boost中有类似的东西吗?
Boost.Asio没有提供与libevent 事件相当的东西.
在Boost.Asio中,创建一个I/O对象,例如socket(1).然后程序将启动一个操作,例如socket.async_receive(buffer, &handler)(2)表示它希望从套接字读取数据,并在读取数据后buffer调用handler.此步骤类似于在libevent中创建非持久性挂起事件,但一个关键区别是Boost.Asio的Proactor将buffer代表用户从套接字读取数据,而不是通知用户数据可供读取.最后,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对象而不是操作:
event_free()不影响读取事件的情况下删除写入事件.另一方面,由于Boost.Asio中无法识别操作,因此只能取消所有待处理操作,例如via socket.cancel(),而不是取消特定操作,例如写入但不能读取.源图像和一般细节可以在这里找到.