如果有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),但要困难得多。