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

时间:2018-09-01 05:47:31

标签: java concurrency locking mutex semaphore

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

我看不到使用信号量的正当理由,因为我们只有 2个线程进行协调。在这种情况下,锁似乎更容易编写代码并进行推理,因为一个线程将锁定缓冲区然后释放它,以便另一个线程可以执行相同的操作。只有2个线程,所以我看不到信令的使用。

有人可以说为什么建议通常将信号量用于生产者-消费者吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

据我所知。

请阅读以下两种情况。

第一种情况

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

第二种情况

让我们想到一个男孩腹泻。他冲到了CR,但发现他的兄弟仍在使用房间。他需要等到他的兄弟完成之后:)让我们以为房间是一个大记忆。

对于生产者和消费者,

假设生产者的商店每天有最多x件商品。

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

这意味着互斥量和信号量具有自己的目的或应用程序,具体取决于您的需求。  仅仅是生产者-消费者的想法,信号量就赢了。

答案 2 :(得分:0)

因为只使用锁/互斥锁,所以您不能阻止使用者在释放锁/互斥锁后立即使用该锁/互斥锁。例如,这可能导致缓冲区为空但生产者暂时不使用锁/互斥锁的情况。