資源簡介
大約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;??
評論
共有 條評論