生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有
代表性的问题。它反映了操作系统中典型的同步例子.
生产者进程(进程由多个线程组成)生产信息,例如它可以是计算进程。消费
者进程使用信息,它可以是输出打印进程。由于生产者和消费者彼此独立,且运
行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受
信息这种情况。为此,需要引入由一个或者若干个存储单元组成的临时存储区,
以便存放生产者所产生的信息,平滑进程间由于速度不确定所带来的问题。这个
临时存储区叫做缓冲区,通常用一维数组来表示。
由一个或若干个存储单元组成的缓冲区叫作“有穷缓冲区”。下面我们来分
析一下有穷缓冲的生产者和消费者的例子。
假设有多个生产者和多个消费者,它们共享一个具有n个存储单元的有穷缓冲
区Buffer(0……n-1),这是一个环形队列。其队尾指针Rear指向当前信息应存放
的位置(Buffer[Rear]),队首指针Front指向当前取出信息的位置(Buffer[front
])。生产者进程总是把信息存放在Buffer[Rear]中,消费者进程则总是从Buffer
[Rear]中取出信息。如果想使生产者进程和消费者进程协调合作,则必须使它们
遵循如下规则:
1) 只要缓冲区有存储单元,生产者都可往其中存放信息;当缓冲区已满时,
若任意生产者提出写要求,则都必须等待;
2) 只要缓冲区中有消息可取,消费者都可从缓冲区中取出消息;当缓冲区为
空时,若任意消费者想取出信息,则必须等待;
3) 生产者们和消费者们不能同时读、写缓冲区。
用JAVA 实现“生产者-消费者”问题的代码如下:
//----------------------------------------------------
// 商品
class Goods {
private int id;
public Goods(int id) { this.id = id; }
public String toString() {
return "Goods: " + id;
}
}
//----------------------------------------------------
// 装东西的容器
class Stack {
private int index = 0;
private Goods[] buffer = new Goods[5]; // 生产者和消费者共享的有界缓冲区
public synchronized void push(Goods goods) {
while(index == buffer.length) {
try {
this.wait();
} catch (InterruptedException e) { e.printStackTrace(); }
}
this.notify();
buffer[index] = goods;
index++;
}
public synchronized Goods pop() {
while(index == 0) {
try {
this.wait();
} catch (InterruptedException e) { e.printStackTrace(); }
}
this.notify();
index--;
return buffer[index];
}
}
//----------------------------------------------------
// 生产者线程
class Producer implements Runnable {
private Stack s = null;
public Producer(Stack s) { this.s = s; }
public void run() {
for(int i = 0; i <= 10; i++) {
Goods g = new Goods(i);
s.push(g);
System.out.println("生产了 " + g);
try {
Thread.sleep(1000);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
//----------------------------------------------------
// 消费者线程
class Consumer implements Runnable {
private Stack s = null;
public Consumer(Stack s) { this.s = s; }
public void run() {
for(int i = 0; i <= 10; i++) {
Goods g = s.pop();
System.out.println("消费了 " + g);
try {
Thread.sleep(1000);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
//----------------------------------------------------
// 主方法
public class ProducerConsumer {
public static void main(String[] args) {
Stack s = new Stack();
Producer p = new Producer(s);
Consumer c = new Consumer(s);
new Thread(p).start();
new Thread(c).start();
}
}
分享到:
相关推荐
在"生产者和消费者问题.txt"文件中,可能包含了使用`BlockingQueue`实现生产者消费者问题的Java代码示例,包括如何创建队列,以及生产者和消费者线程如何交互。而"哲学家就餐问题.txt"文件可能展示了如何用Java的...
"生产者消费者问题"和"读写者问题"是经典的并发控制问题,通过使用信号量机制可以有效地解决这些问题。下面将详细阐述这两个问题以及如何在Linux环境下用C语言实现。 首先,我们来看“生产者消费者问题”。这个问题...
生产者和消费者问题是这样的:想象有一个缓冲区,生产者线程负责生产产品并放入缓冲区,而消费者线程则负责从缓冲区取出并消费产品。问题的核心在于,当缓冲区满时,生产者必须等待消费者消费一部分产品才能继续生产...
"C语言编程模拟生产者和消费者问题" 本文档主要介绍了使用C语言编程来模拟生产者和消费者问题的解决方案。生产者和消费者问题是操作系统中的一种经典问题,它们之间的同步是通过使用PV操作来实现的。PV操作由P操作...
生产者和消费者问题是进程同步中的经典案例,它阐述了如何有效地管理和协调资源的生产与消费,以避免数据竞争和死锁等问题。 生产者和消费者问题涉及到两个主要角色:生产者和消费者。生产者负责生成数据(产品),...
实验报告的标题揭示了本次操作系统课程设计的主题——“生产者和消费者问题”,这是一个经典的问题,常见于多线程编程和并发控制的学习中。该问题旨在模拟一个系统,其中多个生产者线程生产产品,而多个消费者线程...
在计算机科学和编程领域,"多个生产者和消费者问题"是一个经典的并发控制问题,它涉及到多线程或进程之间的同步。在Windows环境下,VC(Visual C++)是常用的开发工具,可以用来解决这类问题。本篇文章将深入探讨...
在计算机科学领域,"生产者和消费者问题"是一个经典的多线程同步问题,它涉及到操作系统中的资源管理和线程协作。该问题由Dijkstra提出,旨在模拟一个系统,其中多个生产者线程创建产品,而多个消费者线程消费这些...
实验一 生产者和消费者问题 因为源码比较长,所以想在网上找现成的,不想自己写,结果找了好久,发现:第一,《操作系统实验指导》基本上找不到电子版的;第二,这个实验的源码也很难找(反正我是没找到,好不容易...
### 操作系统上机实验报告:进程同步和通信——生产者和消费者问题模拟 #### 一、实验目的 本次实验的主要目的是让学生通过调试、修改、运行一个模拟程序,加深对进程概念的理解,熟悉同步和通信的过程,掌握进程...
### 管程机制下的生产者和消费者问题 在计算机科学领域中,**生产者-消费者问题**(Producer-Consumer Problem)是操作系统中一个经典的进程同步问题,它用来描述多个进程之间的数据交换过程中的同步问题。该问题的...
生产者和消费者问题是线程同步的经典案例,常用于演示和理解这两个概念。 **互斥**是指在同一时刻,只有一个线程能访问临界区(critical section),即包含共享资源的代码段。这是通过互斥锁(mutex)来实现的。在...
本主题将深入探讨如何使用信号量这一同步工具来解决两个经典的问题:有限缓冲区的生产者-消费者问题以及读进程具有优先权的读者-写者问题。 首先,我们来看生产者-消费者问题。在这个问题中,有一个有限大小的缓冲...
6. 使用信号量可以解决生产者-消费者问题,防止生产者和消费者线程同时操作缓冲区列表。 7. 互斥信号量用于阻止生产者线程和消费者线程同时操作缓冲区列表。 8. 信号量用于同步生产者线程和消费者线程的操作。
C语言编程模拟生产者和消费者问题 本文详细介绍了使用C语言模拟生产者和消费者问题的实现方法,包括实验目的、实验环境、实验步骤等。实验目的旨在模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误...
(1)创建生产者和消费者线程 在Windows2000环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。 该文件的格式和含义如下: 3 1 ...
linux下C++实现生产者和消费者问题,并及时输出缓存区的状态,方便理解。代码中有详细的注释,方便阅读。
该课程设计的主要目的是掌握基本的同步与互斥算法,了解生产者消费者模型,以及学习使用 Windows 2000/XP 中基本的同步对象,并掌握相关 API 的使用方法。 一、实验目的 本实验的目的是掌握基本的同步与互斥算法,...
(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。 (2)了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 (3)学习使用Windows2000/XP中基本的同步对象,掌握相应的API。 2、...