我们能否获得boost asio io_service对象下面的epoll描述符?我们在应用程序中有多个boost asio io_service对象,一个来自库,另一个来自应用程序本机。库中的io_service对象是服务于多个连接的服务器对象,我们正在研究如何最好地高效地协调多个io_service对象。
答案 0 :(得分:0)
我想说您不需要破坏文档界面即可将两者结合起来。
实际上,已记录的接口足以有效地组合多个io_service对象。
基本上,您要寻找的唯一效率点是避免为其运行单独的事件循环(因为这可能需要比您准备好的线程更多的线程)。
库接口与用于线程创建和管理的接口分离,并允许在没有线程的平台上实现。
和platform specific implementation notes承诺(措辞略有不同,但本质上相似):
在调用io_context :: run(),io_context :: run_one(),io_context :: poll()或io_context :: poll_one()的线程之一中执行使用epoll的多路分解。
这是您的线索。您可以使用io_service
(甚至是poll_one()
)将许多run_one()
编织到一个事件循环中。实际上,此机制可用于与所需的任何第三方事件子系统集成(libev,Qt空闲工作等)。您可以调用poll_one()
来响应最初不支持线程的系统上的硬件中断。
作为一个旁注,相反的是让其他库通过ASIO进行轮询来进行本机套接字操作:Reactor Style Operations。
这两种方法都可以结合在一起。
Boost Asio设计为可扩展的,并且不会干扰您的设计选择。您很可能可以使用公共界面来“解决”第三方库集成方面的问题。
答案 1 :(得分:0)
在最新版本的boost中,有方法run_for和run_until,我们可以在第一个io服务对象上等待指定的时间,并且可以在第一个io服务对象返回或超时时对第二个io服务对象调用poll。