• 大小: 10KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-17
  • 语言: C/C++
  • 标签: C  消费者  生产者  

资源简介

大约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;  

评论

共有 条评论