【问题标题】:How do I multiplex many asynchronous state machines over a fixed number of threads with boost::statechart?如何使用 boost::statechart 在固定数量的线程上多路复用多个异步状态机?
【发布时间】:2015-10-08 23:22:51
【问题描述】:

假设我有许多用 boost::statechart 定义的异步状态机。运行多个异步状态机的明确记录的机制是将它们中的一个或多个固定到一个线程。但是,出于我的目的,我需要运行很多很多异步状态机,而每个线程一个是不行的。此外,任何给定状态机完成的工作量都是不可预测的,因此将状态机分配给固定线程会导致不平衡。

相反,我希望有一个线程池,其中空闲线程可以从队列中提取一些工作量。这里需要注意,以便按顺序传递给定状态机的事件。大概开始的地方是涉及实现调度程序和可能的 FifoWorker 概念来做我想做的事情,分别作为 fifo_scheduler 和 fifo_worker 类的替代品。但是,我想知道这个问题是否已经被其他人解决了,或者我只是问错了问题。

【问题讨论】:

  • 由于异步状态图经验不足,这个组合目前不在我的范围内。但一定要看看 Boost Asio。
  • 是的,线程池对于 boost::asio 来说几乎是微不足道的,而且我已经弄清楚如何确保事件按顺序传递。但是,我不知道如何将它与 boost::statechart 结合起来。如果我不能在这里得到答案,我将不得不权衡尝试弄清楚如何自己实现上述概念与滚动我自己的状态机东西。

标签: c++ multithreading asynchronous boost


【解决方案1】:

回答我自己的问题,现在我已经有时间考虑了。这很简单:

  • 每个状态机都有自己的 fifo_scheduler
  • 当我们希望状态机开始运行时,会向线程池发布一个函数:
    1. 检查 scheduler.terminated(),如果是则停止。
    2. 运行调度程序(n),其中n 是一些与实现相关的值。我们需要它来防止饥饿。
    3. 将自身发布回线程池。

这也确保事件按顺序传递,而无需求助于其他方式。

这不是最好的答案,因为服务函数会占用队列中的空间,即使没有工作要做也会被调用。

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 2016-10-13
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多