从 Boost ASIO 获取 epoll 描述符 io_service对象

getting epoll descriptor from boost asio io_service object

本文关键字:io service 对象 描述 Boost ASIO 获取 epoll      更新时间:2023-10-16

我们可以获取提升 asio io_service对象底层的 epoll 描述符吗? 我们的应用程序中有多个 boost asio io_service 对象,一个来自库,另一个来自应用程序的本机,库中的io_service对象是服务于多个连接的服务器对象,我们正在研究如何最好地有效地协调多个io_service对象。

我想说的是,您不需要破坏记录的界面来组合两者。

事实上,记录的接口足以有效地组合多个io_service对象。

基本上,您可以寻找的唯一效率点是避免为它们运行单独的事件循环(因为这可能需要比您准备的更多的线程(。

正如文档所说:

库接口与线程创建和管理接口分离,并允许在线程不可用的平台上实现。

平台特定的实现说明承诺(措辞略有不同,但基本相似(:

使用 epoll 的解复用在调用 io_context::run((、io_context::run_one((、io_context::p oll(( 或 io_context::p oll_one(( 的线程之一中执行。

这是你的线索。您可以使用poll_one()(甚至run_one()(将许多io_service编织到单个事件循环中。事实上,这种机制可以用来与你想要的任何第三方事件子系统(libev、Qt 空闲工作等(集成。首先,您可以调用poll_one()来响应不支持线程的系统上的硬件中断。

作为旁注,相反的是让其他库执行本机套接字操作,ASIO 执行轮询:反应堆样式操作。

这两种方法都可以结合使用。

总结

Boost Asio被设计为可扩展的,并且不会干扰您的设计选择。您很可能能够使用公共接口"解决"第三方库集成问题。

在最新版本的 boost 中,有方法run_for和run_until,我们可以在第一个 io 服务对象上等待指定的时间,并且可以在第一个 io 服务对象返回或超时时对第二个 io 服务对象调用轮询。