⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shengchan1.txt

📁 操作系统生产者消费者问题的一个程序
💻 TXT
字号:
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<dos.h>
#include<conio.h>

#define NULL  0
/*-------------------------------------------------------*/
struct event
{
	int type;
	int t;
	struct event *next;
};

struct buffer
{
	int flag;
	struct buffer *next;
};

struct person
{
	int type;
	int flag;
	struct person *next;
};
/*-------------------------------------------------------*/
struct event   *prod,*cons;
struct buffer  *in,*out,*head;
struct person  *producers,*consumers;
int    totaltime;
int    prodnum,consnum;
int    buffernum;
int    totalitem=0;

main()
{
	struct person *q;
	int j;
    int flag1=0,flag2=0,flag3=0,flag4=0;
	int t=0;

    start();
	clrscr();
	print(producers,head,consumers,t);
	sleep(1);
	while(t<=totaltime)
	{
		if(prod->t<=cons->t)
		{
			if(totalitem!=buffernum)
			{
				t=prod->t;
				q=producers;
				for(j=1;j<=prodnum;j++)
				{
					if(q->type==prod->type)
					{
                         if(q->flag==0)                                               
					        q->flag=1;   
                           else
						   {
                             q->flag=2;
                             flag1=1;
						   }
					}
				   q=q->next;
				}
				  if(t<=totaltime)
				  {
				    clrscr();
				    print(producers,head,consumers,t);
				    sleep(1);
				  }

                if(flag1==1)
				{
			       putin(t);
                   flag1=0;
				}
				  else
				  doitem();
			}
			   else
			   {
				  t=cons->t;
				  wait(prod,t);
				  q=consumers;
				  for(j=1;j<=consnum;j++)
				  {
					 if(q->type==cons->type)
					 {
                        if(q->flag==0)
						   q->flag=1;
                          else
						  {
							 q->flag=2;
                             flag2=1;
						  }
					 }
					  q=q->next;
				  }
			
                     if(flag2==1)
					 {
				      putout(t);
                      flag2=0;
					 }
				    else
					  wantitem();
			   }
		} 
		
		else
		{
			if(totalitem!=0)
			{
				t=cons->t;
				q=consumers;
				for(j=1;j<=consnum;j++)
				{
					if(q->type==cons->type)
					{
                       if(q->flag==0)
						  q->flag=1;
                         else
						 {
						    q->flag=2;
                            flag3=1;
						 }
					}
					q=q->next;
				}

                if(flag3==1)
				{
				   putout(t);
                   flag3=0;
				}
				  else
					wantitem();
			}
			  else
			  {
				  t=prod->t;
				  wait(cons,t);
			      q=producers;
				  for(j=1;j<=prodnum;j++)
				  {
					  if(q->type==prod->type)
					  {
                           if(q->flag==0)                                               
					          q->flag=1;   
                             else
							 {
                                 q->flag=2;
						         flag4=1;
							 }
					  }
				     q=q->next;
				  }
				    if(t<=totaltime)
					{
				     clrscr();
				     print(producers,head,consumers,t);
				     sleep(1);
					}

                  if(flag4==1)
				  {
			          putin(t);
                      flag4=0;
				  }
				    else
					 doitem();
				
			  }
		}
    }
	clrscr();
	print(producers,head,consumers,totaltime);
	printf("\n\n                                 THE END !! ");
	printf("                                   \n");
	getch();
}
/*=======================================================*/
OrderInsert(int flag,struct event *q)
{
        struct event  *p0;
		if(flag==1)
	       p0=prod;
		 else
			p0=cons;

		if(q->t<=p0->t)
		{
			q->next=p0;
			if(flag==1)
			  prod=q;
			else
				cons=q;
		}
		 else
		 {
	           while(p0->next!=NULL)
			   {
                       if(q->t<=p0->next->t)
					   {
			              q->next=p0->next;
			              p0->next=q;
			              break;
					   }
                       else
                         p0=p0->next;
			   }
	            if(p0->next==NULL)
	              p0->next=q;
		 }
}
/*-------------------------------------------------------*/
start(void)
{
	int i;
	struct event  *p1;
	struct buffer *p2;
	struct person *p3;
	clrscr();
	printf("\nPlease input the number of producers!\n");
	printf("prodnum=(1--6): ");
	      scanf("%d",&prodnum);
	printf("\nPlease input the number of consumers!\n");
	printf("consnum=(1--6): ");
	      scanf("%d",&consnum);
	printf("\nPlease input the number of buffers!\n");
	printf("buffernum=(1--7): ");
	      scanf("%d",&buffernum);
	printf("\nPlease input the totaltime!\n");
	printf("totaltime=(<180): ");
	      scanf("%d",&totaltime);

    randomize();
	prod=(struct event *)malloc(sizeof(struct event)); 
	   prod->type=1;	   
	   prod->t=rand()%6+5;
	   prod->next=NULL;
	producers=(struct person *)malloc(sizeof(struct person));
	   producers->type=prodnum;
	   producers->flag=1;
	   producers->next=NULL;
    for(i=1;i<prodnum;i++)
	{
		p1=(struct event *)malloc(sizeof(struct event));
		   p1->type=i+1;
		   p1->t=rand()%6+5;
		   p1->next=NULL;
		   OrderInsert(1,p1);
		p3=(struct person *)malloc(sizeof(struct person));
		   p3->type=prodnum-i;
		   p3->flag=1;
           p3->next=producers;
		   producers=p3;
	}

	cons=(struct event *)malloc(sizeof(struct event));
	   cons->type=1;
	   cons->t=rand()%6+5;
	   cons->next=NULL;
	consumers=(struct person *)malloc(sizeof(struct person));
	   consumers->type=consnum;
	   consumers->flag=1;
	   consumers->next=NULL;
    for(i=1;i<consnum;i++)
	{
		p1=(struct event *)malloc(sizeof(struct event));
			p1->type=i+1;
			p1->t=rand()%6+5;
			p1->next=NULL;
			OrderInsert(2,p1);
		p3=(struct person *)malloc(sizeof(struct person));
		   p3->type=consnum-i;
		   p3->flag=1;
           p3->next=consumers;
		   consumers=p3;
	}

	head=(struct buffer *)malloc(sizeof(struct buffer));
	   head->flag=0;
	   head->next=head;
	   in=head;
	   out=head;
	for(i=1;i<buffernum;i++)
	{
	    p2=(struct buffer *)malloc(sizeof(struct buffer));
		p2->flag=0;
		p2->next=head->next;
		head->next=p2;
	}

}
/*-------------------------------------------------------*/
putin(int t)
{
	struct event *p;
    struct person *q;
	int  j;

	q=producers;
	for(j=1;j<=prodnum;j++)
	{
		if(q->type==prod->type)
		 q->flag=0;
		 q=q->next;
	}
	in->flag=1;
	in=in->next;
	totalitem++;
	if(t<=totaltime)
	{
	clrscr();
	print(producers,head,consumers,t);
	sleep(1);
	}
	
    q=producers;
	for(j=1;j<=prodnum;j++)
	{
		if(q->type==prod->type)
		{
            randomize();
		    q->flag=rand()%2;
		}
		 q=q->next;
	}
	if(t<=totaltime)
	{
     clrscr();
	 print(producers,head,consumers,t);
	 sleep(1);
	}

    p=(struct event *)malloc(sizeof(struct event));
	    p->type=prod->type;
	    randomize();
	    p->t=prod->t+rand()%6+5;
	    p->next=NULL;
	prod=prod->next;
	OrderInsert(1,p);
}
/*-------------------------------------------------------*/
doitem(void)
{
	struct event *q;
	q=(struct event *)malloc(sizeof(struct event));
	     q->type=prod->type;
	     randomize();
	     q->t=prod->t+rand()%6+5;
	     q->next=NULL;
	 prod=prod->next;
	 OrderInsert(1,q);
}
 /*------------------------------------------------------*/  
putout(int t)
{
	struct event *p;
	struct person *q;
	int  j;
    
    q=consumers;
	for(j=1;j<=consnum;j++)
	{
	  if(q->type==cons->type)
		 q->flag=2;
		 q=q->next;
	 }
	out->flag=0;
	out=out->next;
	totalitem--;
	if(t<=totaltime)
	{
	clrscr();
	print(producers,head,consumers,t);
	sleep(1);
	}

    q=consumers;
	for(j=1;j<=consnum;j++)
	{
	   if(q->type==cons->type)
	   {
          randomize();
		  q->flag=rand()%2;
	   }
		 q=q->next;
	}
	if(t<=totaltime)
	{
	clrscr();
	print(producers,head,consumers,t);
	sleep(1);
	}

	p=(struct event *)malloc(sizeof(struct event));
	     p->type=cons->type;
		 randomize();
		 p->t=cons->t+rand()%6+5;
		 p->next=NULL;
	     cons=cons->next;
	     OrderInsert(2,p);
}
/*-------------------------------------------------------*/
wantitem(void)
{
	struct event *p;
	p=(struct event *)malloc(sizeof(struct event));
	     p->type=cons->type;
		 randomize();
		 p->t=cons->t+rand()%6+5;
		 p->next=NULL;
	cons=cons->next;
	OrderInsert(2,p);
}
/*-------------------------------------------------------*/
wait(struct event *p,int t)
{
	struct event *q;
	q=p;
	do
	{
		if(q->t<t)
		 q->t=t;
		 q=q->next;
	}
	while(q->next==NULL);
}
/*-------------------------------------------------------*/
print(struct person *producers,struct buffer *head,struct person *consumers,int t)
{
	int r;
	struct buffer *p;
	struct person *q;
      printf("\n===================== The producer and consumer problam ");
      printf("=======================\n\n\n");
      printf("          ");
      for(r=1;r<=prodnum;r++)
      printf("--------  ");
      printf("\n");
      printf("producer: ");
      q=producers;
      for(r=1;r<=prodnum;r++)
	  {
	  if(q->flag==2)
	   printf("| **** |  ");
	   else
	   {
            if(q->flag==1)
             printf("|  do  |  ");
              else
               printf("|      |  ");
	   }
       q=q->next;
	  }
	printf("\n");
    printf("          ");
	for(r=1;r<=prodnum;r++)
	printf("--------  ");
    printf("\n\n\n");

	printf("          ");
	for(r=1;r<=buffernum;r++)
	printf("---------");
	printf("\n");
	printf("buffer:   ");
	p=head;
	for(r=1;r<=buffernum;r++)
	{
		if(p->flag==1)
		 printf("| ***** |");
		  else
		     printf("|       |");
		p=p->next;
	}
	 printf("\n");
	 printf("          ");
	 for(r=1;r<=buffernum;r++)
	 printf("---------");
	 printf("\n\n\n");

	 printf("          ");
	 for(r=1;r<=consnum;r++)
	 printf("--------  ");
	 printf("\n");
	 printf("consumer: ");
	 q=consumers;
	 for(r=1;r<=consnum;r++)
	 {
	    if(q->flag==1)
		   printf("|  ??  |  ");
		if(q->flag==2)
		   printf("| **** |  ");
        if(q->flag==0)
           printf("|      |  ");
	    q=q->next;
	 }
	 printf("\n");
	 printf("          ");
	 for(r=1;r<=consnum;r++)
	 printf("--------  ");
	 printf("\n\n\n");
	 printf("============================ CurrentTime = %3d",t);
	 printf(" ================================\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -