在生产者-消费者问题中,为什么我们经常建议使用信号量而不是使用锁/互斥锁?我没有看到使用信号量的正当理由,因为我们只有2 个线程协调。在这种情况下,锁似乎更容易编码和推理,因为一个线程将锁定缓冲区然后释放它,以便另一个线程可以做同样的事情。只有 2 个线程,所以我看不到信号的使用。谁能说为什么建议通常为生产者-消费者使用信号量?
3 回答
尚方宝剑之说
TA贡献1788条经验 获得超4个赞
因为如果你只使用一个锁/互斥锁,你不能阻止消费者在她释放锁/互斥锁后立即拿走锁/互斥锁。例如,这可能会导致缓冲区为空但生产者在一段时间内不使用锁/互斥锁的情况。
RISEBY
TA贡献1856条经验 获得超5个赞
对于我的理解。
请阅读这两个场景。
第一个场景
信号量就像是你摩托车的钥匙。假设您的摩托车最多有两个座位。让我们认为摩托车是资源,座位是共享内存中的两个缓冲空间。
第二种情况
让我们想想一个男孩腹泻。他冲到洗手间,却发现弟弟还在上洗手间。他需要等到他的兄弟完成:) 让我们认为浴室是一个很大的记忆。
对于生产者和消费者来说,
假设生产商有一家商店,每天最多可容纳 x 件商品。
消费者根据物品的可用性购买 x 件物品。
这意味着互斥锁和信号量有自己的用途或应用,具体取决于您的需要。只是对于生产者消费者的想法,信号量已经赢了。
蓝山帝景
TA贡献1843条经验 获得超7个赞
我相信原因是您需要的是类似于条件变量的东西(而不仅仅是互斥锁(监视器)),或者在锁定/解锁的循环中休眠。原因是您不仅拥有共享资源,两个线程中的每一个都有不同的条件来使用资源(缓冲区已满,缓冲区为空)。我认为对于这类问题,一般来说,使用信号量比监视器更受欢迎(因为它们可以处理多个资源)。但是,我不知道为什么,特别是信号量是解决此问题的首选解决方案而不是监视器。
添加回答
举报
0/150
提交
取消