【问题标题】:Rewriting multi-threaded event-driven C++ program to use single-threaded boost::asio重写多线程事件驱动的 C++ 程序以使用单线程 boost::asio
【发布时间】: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


【解决方案1】:

您可以使用boost.fiber - 它提供了一个类似于 std::thread 的 API。 你不一定需要 boost.asio

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2012-08-26
    • 2013-08-30
    • 2011-12-18
    • 2013-02-05
    • 2021-12-28
    相关资源
    最近更新 更多