码迷,mamicode.com
首页 > 其他好文 > 详细

实验四、生产者和消费者

时间:2016-06-21 01:18:43      阅读:481      评论:0      收藏:0      [点我收藏+]

标签:

实验四、生产者和消费者

一、    实验目的

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会继续改进的。

 

 

实验四、生产者和消费者

标签:

原文地址:http://www.cnblogs.com/yore96/p/5602294.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!