猿问

生产者/消费者中的信号量与互斥量

在生产者-消费者问题中,为什么我们经常建议使用信号量而不是使用锁/互斥锁?

我没有看到使用信号量的正当理由,因为我们只有2 个线程协调。在这种情况下,锁似乎更容易编码和推理,因为一个线程将锁定缓冲区然后释放它,以便另一个线程可以做同样的事情。只有 2 个线程,所以我看不到信号的使用。

谁能说为什么建议通常为生产者-消费者使用信号量?


蝴蝶不菲
浏览 220回答 3
3回答

尚方宝剑之说

因为如果你只使用一个锁/互斥锁,你不能阻止消费者在她释放锁/互斥锁后立即拿走锁/互斥锁。例如,这可能会导致缓冲区为空但生产者在一段时间内不使用锁/互斥锁的情况。

RISEBY

对于我的理解。请阅读这两个场景。第一个场景信号量就像是你摩托车的钥匙。假设您的摩托车最多有两个座位。让我们认为摩托车是资源,座位是共享内存中的两个缓冲空间。第二种情况让我们想想一个男孩腹泻。他冲到洗手间,却发现弟弟还在上洗手间。他需要等到他的兄弟完成:) 让我们认为浴室是一个很大的记忆。对于生产者和消费者来说,假设生产商有一家商店,每天最多可容纳 x 件商品。消费者根据物品的可用性购买 x 件物品。这意味着互斥锁和信号量有自己的用途或应用,具体取决于您的需要。只是对于生产者消费者的想法,信号量已经赢了。

蓝山帝景

我相信原因是您需要的是类似于条件变量的东西(而不仅仅是互斥锁(监视器)),或者在锁定/解锁的循环中休眠。原因是您不仅拥有共享资源,两个线程中的每一个都有不同的条件来使用资源(缓冲区已满,缓冲区为空)。我认为对于这类问题,一般来说,使用信号量比监视器更受欢迎(因为它们可以处理多个资源)。但是,我不知道为什么,特别是信号量是解决此问题的首选解决方案而不是监视器。
随时随地看视频慕课网APP

相关分类

Java
我要回答