有界緩衝問題
有n個生產者和m個消費者,鏈接在一個有k個單位緩衝區的有界緩衝上。其中,pi和cj都是併發進程,只要緩衝區未滿,生產者pi生產的產品就可投入緩衝區;只要緩衝區不空,消費者進程cj就可從緩衝區取走並消耗產品。併發
模型:函數
int k; //k個單位的緩衝區 typedef anyitem item; //item類型 item buffer[k]; //緩衝區 int in=0,out=0,counter=0; //in是生產者的定位 out是消費者的定位 counter是產品 //生產者線程 process producer(void) { while (true) { {produce an item in nextp} if (counter==k) //緩衝滿時,生產者睡眠 sleep(producer); //sleep和wakeup系統內核函數,供應用程序調用 buffer[in]=nextp; in=(in+1)%k; //循環隊列 counter++; //產品 if(counter==1) wakeup(consumer); } } //消費者線程 process consumer(void) { while (true) { if (counter==0) //緩衝區空,消費者睡眠 sleep(consumer); nextc=buffer[out]; out=(out+1)%k; //循環對列 counter--; //產品 if(counter==k-1) //緩衝滿了,取走一件產品並喚 wakeup(producer); //醒生產者 {consume the item in nextc};//消耗產品 } }