1

我有五个消费者和一个生产者。五个消费者各自从一个生产者输出不同的数据,持续约 10 毫秒。在这 10 毫秒内,生产者为下一个输出准备参数。设置输出参数后,我想设置一个标志,指示消费者开始下一个输出。我只希望生产者在消费者输出数据时生产。

我不确定如何同步五个消费者和单个生产者。我目前有两个标志,runFlag 和 doneFlag。当消费者读取新数据时,我想将 runFlag 设置为 true 以便计算开始,并且我想将 doneFlag 设置为 false,因为计算尚未完成。但是,如果我在一个消费者中将 doneFlag 设置为 false,则在另一个消费者可以检查标志之前,它可能在另一个消费者中为 false。

我希望我的问题足够具体。如果还有什么我可以提供的,请告诉我。另外,我只是在寻找有关如何进行的总体思路。我知道有多种方法可以做到这一点,但我不确定哪种方法效果最好。

谢谢!

4

2 回答 2

2

您将需要 2 个事件和一个整数引用计数。

当生产者生产了一些东西时:

  • 启动 read_count = 0;
  • 设置事件readme
  • 开始等待事件完成;

消费者等待事件readme。在完成他们的工作后,他们会自动增加read_count. 如果 read_count 达到消费者的数量,在您的情况下为 5,那么它会设置completed事件。因此生产者可以继续并且循环重复自身。

于 2010-06-04T16:44:51.377 回答
0

几年前,我不得不创建一个进行后处理的通用工作调度程序。它不完全是生产者-消费者,可能对您的应用程序来说太过分了,但它可能会给您一些想法。

我特别喜欢使用一对内存中的共享队列,一个出站队列和一个入站队列,像双向通道一样排列。如果您创建一个具有适当的读写同步的队列类,则生产者和消费者可以变得独立。他们不需要知道如何相互同步。

您的数据,生产者和消费者都知道,在工作项类中引用。工作项类包含所有状态标志。数据也应该是线程安全的。

生产者将工作项排入出站队列,每个消费者将单个工作项出列。工作完成后,状态标志会更新,工作项会被发送回入站队列以供生产者进行后期处理。

IIRC,架构只包含三个类左右。

于 2010-06-04T17:40:40.820 回答