在生产者-消费者问题中,为什么我们经常建议使用信号量而不是使用锁/互斥锁?
我看不到使用信号量的正当理由,因为我们只有 2个线程进行协调。在这种情况下,锁似乎更容易编写代码并进行推理,因为一个线程将锁定缓冲区然后释放它,以便另一个线程可以执行相同的操作。只有2个线程,所以我看不到信令的使用。
有人可以说为什么建议通常将信号量用于生产者-消费者吗?
答案 0 :(得分:0)
我相信原因是您所需要的类似于条件变量(而不是只是互斥锁(监视器)),或者处于锁定/解锁的循环中。原因是您只是没有共享资源,两个线程中的每个线程都有不同的条件要使用该资源(缓冲区已满,缓冲区为空)。我认为一般来说,对于此类问题,使用信号量比使用监视器优先(因为它们可以处理多个资源)。但是,我不知道为什么在解决此问题时,特别是为什么信号灯比监视器更受欢迎。
答案 1 :(得分:0)
据我所知。
请阅读以下两种情况。
第一种情况
信号量就像摩托车的钥匙。假设您的摩托车最多有两个座位。让我们以摩托车为资源,座位为共享内存中的两个缓冲空间。
第二种情况
让我们想到一个男孩腹泻。他冲到了CR,但发现他的兄弟仍在使用房间。他需要等到他的兄弟完成之后:)让我们以为房间是一个大记忆。
对于生产者和消费者,
假设生产者的商店每天有最多x件商品。
消费者根据商品的可用性购买x件商品。
这意味着互斥量和信号量具有自己的目的或应用程序,具体取决于您的需求。 仅仅是生产者-消费者的想法,信号量就赢了。
答案 2 :(得分:0)
因为只使用锁/互斥锁,所以您不能阻止使用者在释放锁/互斥锁后立即使用该锁/互斥锁。例如,这可能导致缓冲区为空但生产者暂时不使用锁/互斥锁的情况。