如何解除阻塞等待信号量的所有线程?

How to unblock all threads waiting on a semaphore?

我正在处理有限数组(或有限多个缓冲区)的标准生产者和消费者问题。我尝试使用信号量实现它,但遇到了 运行 问题。我要制作人'produce'只说50遍。之后我想让生产者线程加入主线程。这部分很简单,但我无法做的是加入消费者线程。它们停留在表示没有数据的信号量上。我该如何解决这个问题?
一种可能的选择是有一个标志变量,当生产者加入 main 时该变量变为 True ,之后,主线程将执行 post(semaphore) 与工作线程数一样多的次数。工作线程每次醒来后都会检查标志变量,如果为真,它将退出函数。
我认为我的方法效率很低,因为有很多 post 信号量调用。如果我可以一次解锁所有线程,那就太好了!
编辑:我尝试实现我所说的一切,但由于死锁而无法正常工作

我只在 FreeRTOS 操作系统中用 C++ 完成了生产者消费者结构,所以请记住这一点。到目前为止,这是我在多任务处理方面的唯一经历。我会说我在那个程序中只使用了一个生产者和一个消费者。我在 LabView 中完成了多任务处理,但我认为这与您可能拥有的有点不同。

我认为一个选择可能是拥有一个队列结构,以便生产者将元素排入队列,但如果它充满了数据,那么您可以实现它,以便您可以制定某种队列策略如下

生产者可以

  1. 阻塞自身,直到 space 在队列中可用,
  2. 在特定时间段内阻塞自身,如果花费时间但未成功入队数据,则在其他地方继续
  3. 马上去别处

看起来你的排队策略是有序的...

队列 reader 至少在 FreeRTOS 中可以有类似的三种策略。

一般来说,如果你有一个二进制信号量,那么你就拥有它,以便发送者发送它,接收者等待它。它用于同步或信令。

在我看来你选择了错误的方法 "many semaphores" (???) 你需要的是一个队列结构,生产者输入东西...... 然后,消费者从队列中读取他们必须做的任何事情...... 如果队列为空,那么您需要一个关于队列 reader 线程应该做什么的策略。 那些队列 readers 和信号量 readers 也需要策略选择,以决定他们应该做什么,当队列为空时,或者如果他们没有收到信号量。对于这种问题,我不会使用信号量...

我认为布尔变量的想法可行,因为您只是在生产者线程中写入该变量。如果生产者处于活动状态,那么其他线程应该能够读取和轮询该布尔变量...

但我认为您应该提供更多详细信息,尤其是关于消费者线程、您拥有多少线程以及您使用何种语言编程等等...

一种选择是"poison pill"方法。它假定您知道存在多少消费者线程。假设有N个消费者,那么生产者做完事情后,将N"poison pills"放入队列。 "poison pill" 只是一个 object/value,它与生产者通常生产的任何东西类型兼容,但与普通的 object/value.

不同。

当消费者意识到自己吃了毒丸时,他就死了。问题已解决。