从boost asio io_service对象获取epoll描述符

时间:2018-10-25 06:11:26

标签: c++ boost boost-asio

我们能否获得boost asio io_service对象下面的epoll描述符?我们在应用程序中有多个boost asio io_service对象,一个来自库,另一个来自应用程序本机。库中的io_service对象是服务于多个连接的服务器对象,我们正在研究如何最好地高效地协调多个io_service对象。

2 个答案:

答案 0 :(得分:0)

我想说您不需要破坏文档界面即可将两者结合起来。

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

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

the docs say

  

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

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。