【文章內(nèi)容簡(jiǎn)介】
消費(fèi)產(chǎn)品out緩沖池 out=out+13. 程序流程圖生產(chǎn)者線程開(kāi)始資源信號(hào)量P操作互斥信號(hào)量P操作生產(chǎn)一個(gè)產(chǎn)品把產(chǎn)品送入緩沖區(qū)互斥信號(hào)量V操作資源信號(hào)量V操作等待隊(duì)列中有消費(fèi)者線程等待隊(duì)列中有消費(fèi)者線程線程自我阻塞添加到等待隊(duì)列線程自我阻塞添加到等待隊(duì)列未通過(guò)未通過(guò)通過(guò)通過(guò)喚醒對(duì)頭的消費(fèi)者線程喚醒對(duì)頭的消費(fèi)者線程生產(chǎn)者線程結(jié)束YYNN圖一 生產(chǎn)者流程結(jié)構(gòu)消費(fèi)者線程開(kāi)始資源信號(hào)量P操作互斥信號(hào)量P操作從緩沖區(qū)取出一個(gè)產(chǎn)品消費(fèi)一個(gè)產(chǎn)品互斥信號(hào)量V操作資源信號(hào)量V操作等待隊(duì)列中有生產(chǎn)者線程等待隊(duì)列中有生產(chǎn)者線程線程自我阻塞添加到等待隊(duì)列線程自我阻塞添加到等待隊(duì)列未通過(guò)未通過(guò)通過(guò)通過(guò)喚醒對(duì)頭的生產(chǎn)者線程喚醒對(duì)頭的生產(chǎn)者線程消費(fèi)者線程結(jié)束YYNN圖二 消費(fèi)者流程結(jié)構(gòu)semaphore empty=n。semaphore full=0。semaphore mutex=1。message buffer[n]。int in=0。int out=0。void main(){parbegin(proceducer(),consumer())。}void proceducer(){ do{ prodece a new meddage。P(empty)。P(mutex)。send a new message to buffer[in]。in=(in+1)%n。V(mutex)。V(full)。} while(true)。}void consumer(){ do{ P(full)。 P(mutex)。 get a message from buffer[out]。out=(out+1)%n。V(mutex)。V(empty)。sume a message。}while(true)。}四、 源代碼include include include define random (rand()*10000)/RAND_MAX //定義一個(gè)隨機(jī)函數(shù)來(lái)生產(chǎn)產(chǎn)品,并且使兩個(gè)顧產(chǎn)品間的時(shí)間少于10秒 int long waiting(0)。 //正在等待的產(chǎn)品的數(shù)目 int buffer。 //空位的總數(shù)目 char empty。 //緩沖區(qū)空 char full。 //緩沖區(qū)滿(mǎn) int count(0)。 //產(chǎn)品的號(hào)碼數(shù) int finish(0)。 //生產(chǎn)完畢的產(chǎn)品數(shù)目 DWORD a。 void proceduce() { Sleep (10000)。 cout緩沖區(qū)已空 !endl。 //生產(chǎn)者生產(chǎn)產(chǎn)品函數(shù),用時(shí)10秒 } void getconsum() { Sleep (10001)。 //產(chǎn)品被生產(chǎn)的函數(shù),為了合理區(qū)分生產(chǎn)