实验四、生产者和消费者

一、    实验目的

1、掌握临界区的概念及临界区的设计原则;

2、掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;

3、分析进程争用资源的现象,学习解决进程互斥的方法。

二、    实验内容及要求

分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟

生产者--消费者问题表述:

有一环形缓冲池,包含n个缓冲区(0~n-1)。

有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品,所有进程必须对缓冲区进行互斥的访问,生产者不能向满缓冲区写数据,消费者不能从空缓冲区取数据,即生产者与消费者必须同步,计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者,定义生产者消费者问题中的各数据结构,并初始化。

信号量,初值。

编写PV操作。

编写生产者与消费者程序,利用信号量及其PV操作,实现生产者与消费者之间的同步与互斥。

模拟显示生产者与消费者同步与互斥的效果。

选做:模拟显示读者写者问题的效果。

三、    实验方法及结果测试

代码实现:

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<time.h>

int main() {

int p=0,v=0,run=1,i=0,j,n;

printf("输入缓冲区大小: ");

scanf("%d",&n);

while(run==1) {

srand(time(NULL));

j=rand()%2+1;

if(1==j)

{

if(i<5&&p==0&&v==0)

{

p++;

v++;

i++;

printf("生产\n");

p--;

v--;

}

else {

printf("仓库已满无法生产\n");

}

}

else

{

if(i>0&&p==0&&v==0)

{

p++;

v++;

i--;

printf("消费\n");

p--;

v--;

}

else {

printf("目前没有货物,故无法消费!\n");

}

}

printf("是否继续————1.是 2.否\n");

scanf("%d",&run);

}

}

结果测试:

四、    实验总结

本次实验总的来说还算简单,采用随机的方法对生产——消费进行选择。虽说能模拟出一些效果,但还有点瑕疵,就是有时一直出现无法消费这个选择项,导致缓冲区一直没使用到,这个BUG会继续改进的。

 

时间: 2024-10-18 12:01:53

实验四、生产者和消费者的相关文章

实验四生产者和消费者

实验四生产者和消费者 一.实验目的 1.掌握临界区的概念及临界区的设计原则: 2.掌握信号量的概念.PV操作的含义以及应用PV操作实现进程的同步与互斥: 3.分析进程争用资源的现象,学习解决进程互斥的方法. 二.实验内容和要求 分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟 生产者--消费者问题表述: 有一环形缓冲池,包含n个缓冲区(0~n-1). 有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品. 所有

C# 线程(四):生产者和消费者

From : http://kb.cnblogs.com/page/42530/ 前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待.在C#中,关键字lock定义如下: lock(expres

JAVA-初步认识-第十四章-线程间通信-多生产者多消费者问题-JDK1.5解决办法

一. 在1.5版本中,将原先的形式进行了改变,但是功能并没有任何变化,那么这么做的原因是什么? 以前,我们一个锁上只有一组监视器,这组监视器既监视着生产者,又监视着消费者.这组监视器能将生产者和消费者全都wait,也能将生产者和消费者全都唤醒.或者notify也行,它也能将其中一条线程唤醒,而其中一条不能确定是谁,有可能是本方,也可能是对方. 现在我们的线程进行了分类,一组负责生产,一组负责消费.我们希望生产者能够唤醒消费者,消费者唤醒生产者.如果搞两个监视器,一组监视生产者,一组监视消费者,这

多线程——生产者和消费者(四)

通过前面三篇博客的介绍,基本上对Java的多线程有了一定的了解了,然后这篇博客根据生产者和消费者的模型来介绍Java多线程的一些其他知识. 我们这里的生产者和消费者模型为: 生产者Producer 生产某个对象(共享资源),放在缓冲池中,然后消费者从缓冲池中取出这个对象.也就是生产者生产一个,消费者取出一个.这样进行循环.   第一步:我们先创建共享资源的类 Person,它有两个方法,一个生产对象,一个消费对象 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

四、生产者和消费者

我们这里的生产者和消费者模型为: 生产者Producer 生产某个对象(共享资源),放在缓冲池中,然后消费者从缓冲池中取出这个对象.也就是生产者生产一个,消费者取出一个.这样进行循环. 第一步:我们先创建共享资源的类 Person,它有两个方法,一个生产对象,一个消费对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Person {     private String name;     private 

生产者与消费者模式(线程的同步与互斥)

死锁产生的四个条件: 1.互斥使用(资源独占) 一个资源每次只能给一个进程使用 .2.不可强占(不可剥夺) 资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放 .3.请求和保持(部分分配,占有申请) 一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配) .4.循环等待 存在一个进程等待队列 {P1 , P2 , - , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,-,Pn等待P1占有的资源,形成一个进程等待环路 生产者:生产数据

生产者、消费者模型

转载地址:http://blog.csdn.net/snow_5288/article/details/72794306 一.概念引入 日常生活中,每当我们缺少某些生活用品时,我们都会去超市进行购买,那么,你有没有想过,你是以什么身份去的超市呢?相信大部分人都会说自己是消费者,确实如此,那么既然我们是消费者,又是谁替我们生产各种各样的商品呢?当然是超市的各大供货商,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的超市又该作何理解呢?诚然,它本身是作为一座交

生产者与消费者问题解决:解决先打印出消费的情况

有bug 的代码(马士兵老师讲解的): 1 <span style="font-size:14px;">/**生产者消费者问题,涉及到几个类 2 * 第一,这个问题本身就是一个类,即主类 3 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 4 * 第三,生产什么,消费什么,所以物品类是必须的,这里是馒头类 5 * 第四,既然是线程,那么就不是一对一的,也就是说不是生产一个消费一个,既然这样,多生产的往哪里放, 6 * 现实中就是筐了,在计算机中也就是数据结

7.2.6 - 并发多线程 生产者,消费者

一 生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这个问题于是引入了生产者和消费者模式. 什么是生产者和消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生