生产者/消费者问题何时需要互斥?

时间:2014-02-25 00:41:13

标签: mutex semaphore producer-consumer

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

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

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

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

编辑:得到教授第一个案例的答案是肯定的,第二个案例是否定的,因为缓冲区是非空的,相当于一个完整的缓冲区。当缓冲区为空时,将阻止使用者。当缓冲区包含一个项目时,生产者被阻止。因此,使用互斥锁可以保证互斥。

1 个答案:

答案 0 :(得分:1)

考虑以下链表队列pop方法:

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

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

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

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