资源简介
大约200行代码,生产者消费者问题,课程设计作品,短小精悍,代码完成,注释非常详细,可用于参考和交作业。
代码片段和文件信息
/*****************************************************************************
由用户输入生产者,消费者数量,缓冲池大小,总共运行的时间。
在每个单位运行时间,每次由主函数产生一个随机数0或1,当为0的时候,就调用生产者的相
关程序(执行生产或者存放信息);当为1的时候就调用消费者的相关程序(执行消费或者取
得信息)。然后返回,重新生成随机数,决定下一步调用对象,完成一个循环。
调用生产者时,随机选取生产者中的一个,如果这个生产者没有信息(产品),则生产信息
,如果已经有了信息,就将信息放入缓冲区
调用消费者时,随机选取消费者中的一个,如果这个消费者已经存有了一个信息,则消费掉
这个信息,如果没有信息,则到缓冲池中取得一个。
******************************************************************************/
#include
#include
#define NULL 0
/*************************************/
/*缓冲池中元素的结构,缓冲池大小由用户输入,所有的元素首尾相连,组成一个环形链表*/
struct buffer
{
int flag;/*标志位,为1的时候表示这个元素中含有信息,为0的时候表示这个元素中不含有信息*/
struct buffer *next;/*指向下一个元素*/
};
/*人的结构,可定义为生产者或者消费者*/
struct person
{
int sign;/*标识位,编号,每个生产者消费者都有自己的编号作为区分*/
int flag;/*标志位,为1表示本身已经拥有一个信息,为0表示没有信息*/
struct person *next;/*指向下一个元素,所有的生产者组成一个单链表,消费者组成一个单链表*/
};
/*************************************/
/*定义全局变量,使得所有的程序都可以共同调用,维护*/
struct buffer *in*out;/*对缓冲池操作的头尾指针,通过in指针将信息放入,通过out指针将信息取出*/
struct person *prod*cons*lp;/*指向人结构的指针,prod指向生产者单链表的头指针,cons指向消费者单链表的头指针*/
int totaltime;/*总共运行的时间,实际上就是运行多少次每次主程序都会产生随机数*/
int prodnumconsnum;/*生产者和消费者的总数*/
int buffernum;/*缓冲池的大小*/
int totalitem=0;/*元素的个数,用于显示*/
/*************************************/
/**********************************************
函数input
作用:输入变量值,初始化生产者,消费者,缓冲池链表
************************************************/
void input()
{
int i=1;
struct person *p3;
struct buffer *head*p2;
printf(“Please input the number of producers!\n“);
printf(“prodnum= “);
scanf(“%d“&prodnum);
printf(“Please input the number of consumers!\n“);
printf(“consnum= “);
scanf(“%d“&consnum);
printf(“Please input the number of buffers!\n“);
printf(“buffernum= “);
scanf(“%d“&buffernum);
printf(“Please input the totaltime!\n“);
printf(“totaltime=(<180): “);
scanf(“%d“&totaltime);
/*以上都是输入,不用多解释吧*/
randomize(); /*初始化随机数发生器,保证rand函数产生的随机数更加随机,可以不用*/
prod=(struct person *)malloc(sizeof(struct person));
prod->sign=0; /*初始化生产者单链表的头指针,标号为0,设置没有信息(产品)*/
prod->flag=0;
prod->next=NULL;
for(i=1;i { /*依次加入prodnum个生产者到单链表中*/
p3=(struct person *)malloc(sizeof(struct person));
p3->sign=i; /*每个生产者的标号都是不一样的*/
p3->flag=0;
p3->next=prod; /*理解一下,就是串在一起*/
prod=p3;
}
cons=(struct person *)malloc(sizeof(struct person));
cons->sign=0; /*初始化消费者单链表的头指针*/
cons->flag=0;
cons->next=NULL;
for(i=0;i { /*依次加入consnum个消费者到单链表中*/
p3=(struct person *)malloc(sizeof(struct person));
p3->sign=i;
p3->flag=0;
p3->next=cons;
cons=p3;
}
head=(struct buffer *)malloc(sizeof(struct buffer));
head->flag=0; /*初始化缓冲池环形链表的头指针*/
head->next=head; /*将这个头指针的next指向自己,即组成一个环形链表*/
in=head;
相关资源
- D算法的C++实现
- 算术表达式C算法输入:一个算术表达
- Tms320c55xdsp 语音录音滤波和回放例程
- 基于C/C++的局域网聊天室源码
- 线程池 C++
- 公交信息查询系统 C语言
- FIR的DSP实现C语言实现
- BezierCurve 贝塞尔曲线计算 c++源码
- C语言写矩阵库,适合做矩阵运算
- 飞机订票系统,c++程序
- C++程序设计语言特别版源码
- C++实现播放GIF图片
- C++编写一个计算器,实现加减乘除,
- AES128 C语言实现源码及应用例程
- c语言实现 FCFS和SJF调度算法
- 基于C++的内存池的实现
- 马踏棋盘C语言源代码
- 快速傅立叶变换(FFT) C,C#源码
- 二叉树已知后序和中序遍历求前序遍
- 动态添加、删除树形控件的节点,获
- mfc+opengl离散点绘制曲面
- C语言编写简单聊天室
- activemq-cpp开发手册.pdf
- 简易计算器基于对话框VC6.0
- rs485通讯C++
- erf()函数C语言代码
- C++知识体系图解超详细
- C语言课程设计报告-长整数四则运算
- 数据结构课程设计 通讯录的制作
- C++课件+STL
评论
共有 条评论