【发布时间】:2018-03-28 23:38:22
【问题描述】:
我正在重构一个负责 IO 操作的大型代码库。目前该程序由多个线程组成,每个线程都等待接收专有事件。事件被发布到全局事件队列并被所有线程接收(全局事件调度程序为每个线程调用一个事件处理函数,该线程根据事件类型确定它是否应该做某事,并在必要时添加事件到它自己的工作队列)。
这种架构有很多开销,这既是因为有很多线程(单个 arm 核心上大约 12 个)大部分都在休眠,也因为工作队列。它还需要数百个不同的事件类,这会降低可维护性。
我想用单线程 boost asio 方法替换这个基于事件的架构,但我不确定我应该使用什么范例来做到这一点。我认为 boost::io_service 可能是最好的,但协程、纤维或其他东西可能会更好。
有没有人建议什么 boost::asio 范式在离开事件队列时会导致最平滑的转换?我正在寻找可以提高代码可维护性的东西,而不是让代码完全无法理解以换取减少开销。
这看起来很有希望,但是协程语法有点吓人,而且很难卖给我团队的其他成员: http://www.boost.org/doc/libs/1_57_0/libs/coroutine/doc/html/coroutine/motivation.html
【问题讨论】:
-
这看起来像是一个更适合Software Engineering 的问题,而不是我的 SO。不过,它和 SO 在范围上的差异对我来说有点灰色地带,所以我会避免投票。
-
协程是可选的,你不必使用基于
asio::io_service的调度。只需将事件处理程序设为“nullary”函数对象,并将post()设置为io_service- 它们将被异步调用。 -
@IgorR。谢谢,这正是我希望没有体验过 boost:asio 的。
-
@CássioRenan 谢谢,我会检查堆栈交换。我以前没听说过。
标签: c++ boost boost-asio