b/w生产者/消费者和写/读多线程建模的本质区别是啥?
Posted
技术标签:
【中文标题】b/w生产者/消费者和写/读多线程建模的本质区别是啥?【英文标题】:What is the essential distinction b/w producer/consumer & write/read multithread modeling?b/w生产者/消费者和写/读多线程建模的本质区别是什么? 【发布时间】:2017-05-22 01:30:00 【问题描述】:在面试多线程建模问题时,有两个模型经常被问到:
-
生产者/消费者模型
写入器/读取器模型
我的问题是我无法理解这两种模型之间的本质区别。
我对这两个模型的理解如下: 对于生产者/消费者模型,生产者直到某些停止条件,在该条件下它向消费者发出信号并等待另一个条件变量,而消费者等待直到生产了一个项目,然后继续“消费它”,通知生产者另一个插槽已准备好用于生产。
对于写入器/读取器模型,应用了三个关键参数(ref):使用一个互斥体、两个条件变量和三个整数。
readers - readers in the cv readerQ plus the reading reader
writers - writers in cv writerQ plus the writing writer
active_writers - the writer currently writing. can only be 1 or 0.
对我来说,它们都使用“互斥量和条件变量”,唯一的区别是生产者/消费者等待和通知条件变量,而读/写使用条件变量和整数一起检查是否满足锁定/解锁条件。
我知道一个区别是,对于生产者/消费者模型,生产者和消费者都会更改共享数据,但它们彼此断开连接。它们只是通过共享数据(通常由队列指示)进行通信。生产者/消费者无需知道是否有可用的消费者/生产者,即双方的状态并不重要。但是,在写/读模型中,双方都需要跟踪对方的状态(即可用号码)。但是,我相信这不是本质区别。
除了以上幼稚的理解之外,任何人都可以帮助告诉我这两种模型之间的本质区别是什么?非常感谢!
【问题讨论】:
为了清楚起见,这个问题需要大量编辑。我有点理解 OP 的意图,但它只是写得非常循环。 【参考方案1】:嗯,它们实际上是无关紧要的:
在非常高的水平:
生产者/消费者旨在让某人(生产者)生产数据以进行处理。其他人(消费者)正在等待数据。一旦要处理的数据到达,它将被一个(并且只有一个)消费者消费。然后消费者拥有数据并执行其工作。
Reader/Writer 是一种锁定共享资源/数据的方法。每个人都在处理相同的数据。但是,我们知道有时需要修改数据,因此我们希望作为 Writer 工作(因此获得 Writer 锁)。有时数据只是需要被读取,因此我们想作为 Readers 工作。 Reader-Writer-lock 的全部目的是避免不必要的争用,因为 Reader 只是对资源进行只读操作。
【讨论】:
以上是关于b/w生产者/消费者和写/读多线程建模的本质区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章
基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)