首页 > 解决方案 > 如何解除阻塞等待信号量的所有线程?

问题描述

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

标签: multithreadingdeadlocksemaphoreproducer-consumer

解决方案


一种选择是“毒丸”法。它假设您知道存在多少消费者线程。假设有 N 个消费者,那么生产者做完之后,将 N 个“毒丸”放入队列。“毒丸”只是一个对象/值,它与生产者通常生产的任何东西类型兼容,但与普通对象/值有区别。

当消费者意识到它吃了毒丸时,它就会死去。问题解决了。


推荐阅读