【问题标题】:When are mutexs required for producer/consumer problems?生产者/消费者问题何时需要互斥锁?
【发布时间】:2014-03-26 23:22:28
【问题描述】:

如果有 1 个生产者、1 个消费者和 >1 大小的缓冲区,是否需要插入互斥锁?是否需要删除互斥锁?

如果有 1 个生产者、1 个消费者和 1 个大小的缓冲区,是否需要插入互斥锁?是否需要删除互斥锁?

如果有 >1 个生产者、>1 个消费者和 1 个大小的缓冲区,是否需要插入互斥锁?是否需要删除互斥锁?

谁能解释一下你是如何回答这些问题的。我知道两个线程在写入缓冲区时永远不应该从缓冲区中读取,但这是否意味着所有场景都需要两个互斥锁?

教授的回答:第一种情况是肯定的,后两种情况是否定的,因为当缓冲区非空时相当于一个完整的缓冲区。当缓冲区为空时,消费者被阻塞。当缓冲区包含一个项目时,生产者被阻塞。因此,在不使用互斥锁的情况下可以保证互斥。这无助于理解为什么会这样。好在自从发表这篇文章以来,有了更多的经验。

【问题讨论】:

  • 这听起来像是家庭作业。看来你需要自己找出答案,这就是你获得理解的方式。
  • @Barmar 是的,这是一个家庭作业问题。我只是不认为我一直需要互斥锁的回答是正确的。我只是想要一点指导。
  • 如果你发布了你的答案,解释了为什么你认为它是正确的,然后问你为什么错了,那会更合适。虽然 cs.stackexchange.com 可能是更适合讨论的地方。
  • 阅读我写的问题的最后一行,我知道两个线程在写入缓冲区时永远不应该从缓冲区中读取,这让我认为所有情况都需要互斥锁。我觉得我错过了什么,复习笔记并没有帮助。

标签: mutex semaphore producer-consumer


【解决方案1】:

考虑以下链表队列弹出方法:

Object pop() {
    if(this.head != null) {
        Node n = this.head;
        this.head = n.next;
        return n.data;
    }
    return null;
}

此方法不是线程安全的。考虑一下如果线程在执行第 3 行后暂停,另一个线程调用 pop 会发生什么;两个线程都会得到相同的对象。

互斥锁确保两个线程不能同时访问同一个资源,从而防止这种“竞争条件”。通过确保一次只有一个线程可以弹出一个元素,可以保持队列的一致性。

可以在不使用互斥体的情况下实现队列(例如Java's ConcurrentLinkedList),但要困难得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 2020-10-15
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2020-01-21
    相关资源
    最近更新 更多