我正在处理带有有限数组(或有限多个缓冲区)的标准生产者和消费者问题。我尝试使用信号量实现它,但遇到了问题。我希望生产者仅“说” 50次。之后,我希望生产者线程加入主线程。这部分很简单,但是我无法做的就是加入使用者线程。它们停留在信号量上,表示没有数据。我该如何解决这个问题?
一种可能的选择是使标志变量在生产者加入main时变为True,此后,主线程执行post(semaphore)的次数将等于工作线程的数量。辅助线程每次唤醒后都会检查flag变量,如果为True,它将退出该函数。
我认为我的方法效率很低,因为有许多后信号量调用。如果我可以一次解除所有线程的阻塞,那就太好了!
编辑:我尝试实现我所说的内容,但由于死锁而无法正常工作
答案 0 :(得分:2)
一种选择是“毒丸”方法。它假定您知道有多少个使用者线程。假设有N个消费者,那么在生产者完成任务后,它将N个“毒丸”放入队列。 “毒丸”只是一种对象/值,与生产者通常生产的任何东西在类型上兼容,但是可以与正常对象/值区分开。
当消费者认识到自己已经吃了毒丸时,就会死亡。问题解决了。
答案 1 :(得分:1)
我仅在FreeRTOS操作系统中使用C ++完成了生产者使用者结构,因此请记住这一点。到目前为止,这是我唯一的多任务处理经验。我会说,我在该程序中只使用了一个生产者和一个消费者。我已经在LabView中完成了多任务处理,但是我认为这与您可能拥有的有点不同。
我认为一个选择可能是拥有一个队列结构,以便生产者将元素排队到队列中,但是如果数据已满,那么您可以希望实现它,以便可以制定如下的队列策略
生产者可以
因此,您似乎有顺序的排队政策...
至少在FreeRTOS中,队列读取器能够具有类似的三种类型的策略。
通常,如果您具有二进制信号量,则可以使用它,以便发送方发送它,而接收方等待它。它用于同步或信令。
我认为您选择了带有“许多信号量”的错误方法(???) 您需要的是一个队列结构,生产者在其中输入内容。 然后,消费者从队列中读取他们必须做什么。 如果队列为空,则需要有关队列读取器线程应该做什么的策略。 对于那些队列读取器和信号灯读取器,当队列为空或没有收到信号时,也应该选择策略。对于此类问题,我不会使用信号量...
我认为布尔变量的想法可行,因为您只在生产者线程中写入该变量。如果生产者处于活动状态,则其他线程应该能够读取并轮询该布尔变量。
但是我认为您应该提供更多详细信息,您要尝试做的事情,尤其是对于消费者线程,您拥有多少种线程以及您使用哪种语言进行编程等等...