为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶不菲 2021-08-25 10:59:21
在生产者-消费者问题中,为什么我们经常建议使用信号量而不是使用锁/互斥锁?我没有看到使用信号量的正当理由,因为我们只有2 个线程协调。在这种情况下,锁似乎更容易编码和推理,因为一个线程将锁定缓冲区然后释放它,以便另一个线程可以做同样的事情。只有 2 个线程,所以我看不到信号的使用。谁能说为什么建议通常为生产者-消费者使用信号量?
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-08-25
?
RISEBY

TA贡献1856条经验 获得超5个赞

对于我的理解。

请阅读这两个场景。

第一个场景

信号量就像是你摩托车的钥匙。假设您的摩托车最多有两个座位。让我们认为摩托车是资源,座位是共享内存中的两个缓冲空间。

第二种情况

让我们想想一个男孩腹泻。他冲到洗手间,却发现弟弟还在上洗手间。他需要等到他的兄弟完成:) 让我们认为浴室是一个很大的记忆。

对于生产者和消费者来说,

假设生产商有一家商店,每天最多可容纳 x 件商品。

消费者根据物品的可用性购买 x 件物品。

这意味着互斥锁和信号量有自己的用途或应用,具体取决于您的需要。只是对于生产者消费者的想法,信号量已经赢了。


查看完整回答
反对 回复 2021-08-25
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-08-25
  • 3 回答
  • 0 关注
  • 218 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信