#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define LENR sizeof(struct ready)
#define LENW sizeof(struct wait)
/*仓库*/
int cangku=0;
/*各进程时间片统计*/
int tpa=0;
int tpb=0;
int tca=0;
int tcb=0;
int tw=0;
int tr=0;
/*生产消费数量*/
int a_p=0;
int b_p=0;
int a_c=0;
int b_c=0;
/*信号量S*/
int s=1;
int j,k,i;
/*就绪队列结构*/
struct ready
{
int sign;
}rq[4];
/*等待队列结构*/
struct wait
{
int sign;
}wq[4];
/*P原语*/
int P(int s)
{
if(s>0)
{
s=s-1;
return 1;
}
else return 0;
}
/*V原语*/
V(int s)
{
if(s==0)
{
s=s+1;
}
else {};
}
/*生产者A管理进程*/
PA()
{
tpa=tpa+1;
j=0;
while(wq[j].sign!=0&&j<4)
{
j=j+1;
}
if(wq[j].sign==0)
{
wq[j].sign=1;
}
else {};
}
/*B生产者管理进程*/
PB()
{
tpb=tpb+1;
j=0;
while(wq[j].sign!=0&&j<4)
{
j=j+1;
}
if(wq[j].sign==0)
{
wq[j].sign=2;
}
else {};
}
/*消费者A管理进程*/
CA()
{
tca=tca+1;
j=0;
while(wq[j].sign!=0&&j<4)
{
j=j+1;
}
if(wq[j].sign==0)
{
wq[j].sign=3;
}
else {};
}
/*消费者B管理进程*/
CB()
{
tcb=tcb+1;
j=0;
while(wq[j].sign!=0&&j<4)
{
j=j+1;
}
if(wq[j].sign==0)
{
wq[j].sign=4;
}
else {};
}
/*等待队列进程*/
wait_tenor()
{
tw=tw+1;
if(wq[0].sign!=0)
{
j=0;
while(rq[j].sign!=0&&j<4)
{
j=j+1;
}
if(rq[j].sign==0)
{
rq[j].sign=wq[0].sign;
for(j=0;j<4;j++)
{wq[j].sign=wq[j+1].sign;}
wq[3].sign=0;
}
else {};
}
else {};
}
/*就绪队列进程*/
ready_tenor()
{
tr=tr+1;
if(rq[0].sign!=0)
{
if(rq[0].sign==1)
{
produce(1);
for(j=0;j<4;j++)
{rq[j].sign=rq[j+1].sign;}
rq[3].sign=0;
}
else if(rq[0].sign==2)
{
produce(2);
for(j=0;j<4;j++)
{rq[j].sign=rq[j+1].sign;}
rq[3].sign=0;
}
else if(rq[0].sign==3)
{
custom(1);
for(j=0;j<4;j++)
{rq[j].sign=rq[j+1].sign;}
rq[3].sign=0;
}
else {
custom(2);
for(j=0;j<4;j++)
{rq[j].sign=rq[j+1].sign;}
rq[3].sign=0;
}
}
else {};
}
/*生产商品函数*/
produce(int j)
{
if(j==1)
{
k=P(s);
if(k)
{
if(cangku<3)
{
cangku=cangku+1;
a_p=a_p+1;
}
else V(s);
}
else V(s);
}
else {
k=P(s);
if(k)
{
if(cangku<3)
{
cangku=cangku+1;
b_p=b_p+1;
}
else V(s);
}
else V(s);
}
}
/*消费商品函数*/
custom(int j)
{
if(j==1)
{
k=P(s);
if(k)
{
if(cangku>0)
{
cangku=cangku-1;
a_c=a_c+1;
V(s);
}
else V(s);
}
else V(s);
}
else {
k=P(s);
if(k)
{
if(cangku>0)
{
cangku=cangku-1;
b_c=b_c+1;
V(s);
}
else V(s);
}
else V(s);
}
}
main_print()
{
gotoxy(6,2);
printf("product A: %d/%d",a_p,tpa);
gotoxy(6,3);
printf("product B: %d/%d",b_p,tpb);
gotoxy(6,4);
printf("custom A: %d/%d",a_c,tca);
gotoxy(6,5);
printf("custom B: %d/%d",b_c,tcb);
gotoxy(6,6);
printf("cangku : %d/3",cangku);
gotoxy(6,7);
printf("ready_tenor:%d ",tr);
for(j=0;j<4;j++)
{
if(rq[j].sign==1)
printf(" product_A");
else if(rq[j].sign==2)
printf(" product_B");
else if(rq[j].sign==3)
printf(" custom_A ");
else if(rq[j].sign==4)
printf(" custom_B");
else printf(" NULL ");
}
gotoxy(6,15);
printf("wait_tenor: %d ",tw);
for(j=0;j<4;j++)
{
if(wq[j].sign==1)
printf(" product_A");
else if(wq[j].sign==2)
printf(" product_B");
else if(wq[j].sign==3)
printf(" custom_A ");
else if(wq[j].sign==4)
printf(" custom_B");
else printf(" NULL ");
}
if(i==0) {gotoxy(1,7);printf("cpu->");}
else {gotoxy(1,7);printf(" ");}
if(i==1) {gotoxy(1,15);printf("cpu->");}
else {gotoxy(1,15);printf(" ");}
if(i==2) {gotoxy(1,2);printf("cpu->");}
else {gotoxy(1,2);printf(" ");}
if(i==3) {gotoxy(1,3);printf("cpu->");}
else {gotoxy(1,3);printf(" ");}
if(i==4) {gotoxy(1,4);printf("cpu->");}
else {gotoxy(1,4);printf(" ");}
if(i==5) {gotoxy(1,5);printf("cpu->");}
else {gotoxy(1,5);printf(" ");}
}
main()
{
time_t t;
srand((unsigned) time(&t));
i=rand() % 6;
do
{
if(i==0) {
ready_tenor();
main_print();
i=rand() % 6;
}
else if(i==1) {
wait_tenor();
main_print();
i=rand() % 6;
}
else if(i==2) {
PA();
main_print();
i=rand() % 6;
}
else if(i==3) {
PB();
main_print();
i=rand() % 6;
}
else if(i==4) {
CA();
main_print();
i=rand() % 6;
}
else {
CB();
main_print();
i=rand() % 6;
}
getch();
}while(getch()!='e');
}