2010-06-04 47 views
1

我有五个消费者和一个生产者。每个消费者输出不同的数据,从一个生产者那里得到~10ms。在这10ms期间,制造商准备下一个输出的参数。当设置输出参数时,我想设置一个标志,指示消费者开始下一个输出。我只希望生产者在消费者输出数据时生产。C++:将5个消费者同步到1个生产者(多线程)

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

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

谢谢!

+0

您可以使用支持共享互斥的Boost线程。 [链接](http://www.boost.org/doc/libs/1_43_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.shared_lockable) – 2010-06-04 16:48:47

回答

2

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

当生产者已产生了一些事情它:

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

消费者等待事件readme。在完成他们的工作之后,他们原始地增加了read_count。如果read_count达到了消费者数量,则在您的情况下为5,然后设置completed事件。因此生产者可以继续,循环重复。

+0

谢谢,这正是我正在寻找的。 – Dan 2010-06-04 17:28:44

+0

你可以用信号量做同样的事情。 – SigTerm 2010-06-04 17:46:49

0

几年前,我不得不创建一个后处理的通用工作调度程序。它不完全是一个生产者 - 消费者,可能会损害你的应用程序,但它可能会给你一些想法。

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

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

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

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