我有五个消费者和一个生产者。五个消费者每个输出不同的数据,从一个生产者,约10毫秒。在那10ms期间,生产者为下一个输出准备参数。设置输出参数后,我想设置一个标志,指示消费者开始下一个输出。我只希望生产者在消费者输出数据时生产。
我不确定如何同步五个消费者和单个生产者。我目前有两个标志,runFlag和doneFlag。当消费者读取新数据时,我想将runFlag设置为true,以便开始计算,并且我想将doneFlag设置为false,因为计算尚未完成。但是,如果我在一个消费者中将doneFlag设置为false,则在该消费者可以检查该标志之前,在另一个消费者中可能是假的。
我希望我的问题足够具体。如果我能提供其他任何信息,请告诉我。另外,我只是在寻找如何进行的一般概念。我知道有多种方法可以做到这一点,但我不确定哪种方法效果最好。
谢谢!
答案 0 :(得分:2)
您将需要2个事件和一个整数引用计数。
当制作人制作了一些东西时:
readme
。消费者等待活动readme
。完成工作后,他们会不自然地增加read_count
。如果read_count达到了消费者数量,在您的情况下为5,那么它会设置completed
事件。因此,生产者可以继续,循环重复。
答案 1 :(得分:0)
几年前,我不得不创建一个进行后期处理的通用工作调度程序。它不是一个生产者 - 消费者,可能对你的应用程序来说太过分了,但它可能会给你一些想法。
我特别喜欢使用一对内存中的共享队列,一个出站队列和一个入站队列,像双向通道一样排列。如果创建一个具有正确读写同步的队列类,则生产者和使用者可以独立。他们不需要知道如何彼此同步。
您在工作项类中引用的生产者和消费者所知的数据。工作项类包含所有状态标志。数据也应该是线程安全的。
生产者将工作项排入出站队列,每个使用者将单个工作项出列。工作完成后,状态标志将更新,工作项将回发到入站队列,以供生产者进行后期处理。
IIRC,架构只包含三个类左右。