如何使用boost::statechart在固定数量的线程上复用许多异步状态机



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

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

回答我自己的问题,现在我有一些时间来思考它。这很简单:

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

这也确保了事件是按顺序交付的,而不需要使用其他方法。

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

最新更新