【问题标题】:Semaphore vs Mutex in Producer/Consumer生产者/消费者中的信号量与互斥量
【发布时间】:2018-09-01 05:47:31
【问题描述】:

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

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

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

【问题讨论】:

  • 许多场景涉及多个生产者和/或消费者,在这种情况下,信号量更有意义。
  • "谁能说一下为什么建议使用信号量通常用于生产者-消费者?" - 我们只能猜测为什么有人更喜欢信号量或互斥锁来解决一些生产者/消费者问题。偏好信号量可能是历史原因。这可能是简单原因,因为单独的互斥锁不允许等待空/满队列。 (为此等待,您需要条件变量,但它们对于初学者来说相当复杂)。此外,生产者/消费者不是一个单一的问题——它是一类问题。这个类的不同问题使用不同的方法以不同的方式解决。
  • 看来这个问题是一个普遍的问题,而不是一个特定于 Java 的问题。你介意删除“java”标签吗?

标签: java concurrency locking mutex semaphore


【解决方案1】:

因为如果您只使用锁/互斥锁,则无法阻止消费者在释放锁/互斥锁后立即获取锁/互斥锁。例如,这可能会导致缓冲区为空但生产者暂时不使用锁/互斥锁的情况。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      据我所知。

      请阅读这两个场景。

      第一个场景

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

      第二种情况

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

      对于生产者和消费者,

      假设生产者有一家商店,每天最多有 x 个商品。

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

      这意味着互斥量和信号量有自己的用途或应用程序,具体取决于您的需要。 只是对于Producer-consumer的想法,信号量赢了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多