从 Boost ASIO 获取 epoll 描述符 io_service对象
getting epoll descriptor from boost asio io_service object
我们可以获取提升 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 服务对象调用轮询。
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- Agora.io 虚幻引擎插件构建错误
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 通过 Tor 服务C++ socket.io 客户端
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何读取 google::p rotobuf::io::CodedOutputStream::WriteVarint32
- Conan.io 在编译步骤中或已经在签出时
- C++中真正的异步文件 IO
- 在C++中返回 IO 对象的目的是什么?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- C++网络 IO、文件处理和网络故障
- Xcode OSX上的C++构建失败,出现多个错误文件IO..不可用:在macOS 10.15中引入
- Android Studio-在现有的旧项目中启用本机C++调试(card.io Android Source)
- 如何检测函数是否执行IO操作
- 如何键入用于const对象的自定义io操纵器
- libevent是否允许在不同的线程中运行timer/io的回调
- IO服务重新启动后,Boost最后期限计时器持续触发