讀者寫者問(wèn)題實(shí)驗(yàn)代碼_第1頁(yè)
讀者寫者問(wèn)題實(shí)驗(yàn)代碼_第2頁(yè)
讀者寫者問(wèn)題實(shí)驗(yàn)代碼_第3頁(yè)
讀者寫者問(wèn)題實(shí)驗(yàn)代碼_第4頁(yè)
讀者寫者問(wèn)題實(shí)驗(yàn)代碼_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)驗(yàn)內(nèi)容 1、定義一個(gè)數(shù)據(jù)緩存buffer及用于實(shí)現(xiàn)同步互斥的信號(hào)量。 2、定義一個(gè)讀者函數(shù):l 當(dāng)有寫者在占用buffer時(shí),讀者應(yīng)該等待,直到寫者不再使用該buffer。l 當(dāng)有其他讀者在占用buffer時(shí),讀者可對(duì)buffer進(jìn)行讀取操作。l 當(dāng)buffer中有數(shù)據(jù)時(shí),則從其中讀取一個(gè)數(shù)據(jù),并顯示然后退出。l 當(dāng)buffer中沒(méi)有數(shù)據(jù)時(shí),應(yīng)等待,直到buffer中有數(shù)據(jù)可讀。 3、定義一個(gè)寫者函數(shù)l 當(dāng)有讀者在占用buffer時(shí),寫者應(yīng)該等待,直到所有的讀者都退出為止。l 當(dāng)有其他寫者占用buffer時(shí),該寫者應(yīng)該等待,直到占用buffer的寫者退出為止。l 當(dāng)buffer有空閑時(shí),寫者

2、應(yīng)該在buffer中寫入一個(gè)數(shù)據(jù)并退出。l 當(dāng)buffer滿時(shí),寫者應(yīng)該等待,直到buffer有空閑為止。 4、定義主函數(shù),在其中可以任意創(chuàng)建讀者與寫者。l 可根據(jù)用戶輸入創(chuàng)建讀者或?qū)懻哌M(jìn)程(線程)。 5、用戶界面2. 寫者:開(kāi)始讀出的內(nèi)容:1. 讀者:開(kāi)始結(jié)束21讀者隊(duì)列等待結(jié)束寫出的內(nèi)容:Hello world !結(jié)束實(shí)驗(yàn)當(dāng)堂所要完成事情列表:1. 調(diào)試程序使其在讀者優(yōu)先模式下可以運(yùn)行并且能實(shí)現(xiàn)基本的功能得出正確的結(jié)果:能夠?qū)崿F(xiàn)讀寫互斥,寫寫互斥,讀讀不互斥,一個(gè)進(jìn)程結(jié)束能夠喚醒等待隊(duì)列中的進(jìn)程(先讀者隊(duì)列后寫著隊(duì)列)2. 根據(jù)實(shí)驗(yàn)要求完善功能:由用戶決定寫者向緩沖區(qū)中寫入的內(nèi)容,讀者能夠

3、讀出并顯示出來(lái);當(dāng)緩沖區(qū)中沒(méi)有數(shù)據(jù)時(shí),讀者要等待,直到緩沖區(qū)中有數(shù)據(jù)才能讀3. 根據(jù)“讀者優(yōu)先”加以改變,增加一個(gè)“寫者優(yōu)先”模式,并且由用戶來(lái)選擇模式源代碼:#include<stdio.h>#include<stdlib.h>int rcount=0;/正在讀的讀者數(shù)量int wcount=0;/寫者隊(duì)列中等待寫操作的寫者數(shù)量int read_id=0;/讀進(jìn)程號(hào)int write_id=0;/寫進(jìn)程號(hào)int w=1;/讀寫互斥信號(hào)量char temp300 = '0'int choice; /用戶選擇讀者優(yōu)先OR寫者優(yōu)先int sign; /標(biāo)識(shí)t

4、emp空的信號(hào)量 0表示temp空void WFwakeup();void RFwakeup();struct rqueue/讀者等待隊(duì)列int readers200;int index;rq;struct wqueue/寫者等待隊(duì)列int writers200;int index;wq;/*void first() /初始化int i;rq.index = 0;wq.index = 0;for(i = 0;i<20;i+)rq.readersi = 0;wq.writersi = 0;*/*讀進(jìn)程讀操作void read()int i = 0;read_id+;if(rcount =

5、0)/當(dāng)前沒(méi)有讀進(jìn)程在讀 可能有寫進(jìn)程在寫 可能CPU空閑if(w=1) /如果CPU空閑,讀者拿到CPUw-;/ 相當(dāng)于一個(gè)P操作rcount+;if(temp0 = '0')sign = 0;if(choice = 1)rq.readersrq.index+=read_id;/將讀者進(jìn)程加入等待隊(duì)列RFwakeup();return;elserq.readersrq.index+=read_id;/將讀者進(jìn)程加入等待隊(duì)列WFwakeup();return;/ifprintf("讀者%d正在讀n",read_id);for(i = 0;i < 300

6、;i+)/讀取temp內(nèi)容 即寫者寫的內(nèi)容if(tempi = '0')printf("n");return;/ifprintf("%c",tempi);/for/ifelse/寫者線程正在執(zhí)行printf("!有寫者在寫不能讀!n");rq.readersrq.index+=read_id;/將讀者進(jìn)程加入等待隊(duì)列/else/ifelse/rcount !=1 則知道當(dāng)前已經(jīng)有讀者在讀,讀讀不互斥,則這個(gè)讀者可以直接進(jìn)來(lái)了讀printf("讀者%d正在讀n",read_id);for(i = 0;

7、i < 300;i+) if(tempi = '0')printf("n");return;printf("%c",tempi);/for/else/*寫進(jìn)程寫操作void write()write_id+;if(w = 0)if(rcount != 0 )/有讀者進(jìn)程在執(zhí)行printf("!有讀者在讀不能寫!n");wq.writerswq.index+=write_id;/將寫者進(jìn)程加入等待隊(duì)列wcount+;return;if(rcount = 0 )/rcount = 0則當(dāng)前無(wú)讀者,但w = 0,所以有

8、寫者在寫printf("!有寫者在寫不能寫!n");wq.writerswq.index+=write_id;/將寫者進(jìn)程加入等待隊(duì)列wcount+;return;if(w = 1)w-;printf("寫者%d正在寫n請(qǐng)輸入要寫的內(nèi)容",write_id); scanf("%s",temp);/while/if/*讀者優(yōu)先時(shí)喚醒進(jìn)程void RFwakeup()int i = 0;int j = 0;int m,n;m = rq.index;/n = wq.index;if(rcount = 0)/當(dāng)前無(wú)讀進(jìn)程,是寫者在寫 -停止運(yùn)

9、行寫進(jìn)程bool reader_wait=false; w=1;printf("寫者已經(jīng)寫完n");sign = 1;/temp中已經(jīng)有內(nèi)容 要置1for(i=0;i<=m;i+)/index為當(dāng)前讀者隊(duì)列中的等待進(jìn)程數(shù)if(rq.readersi!=0)reader_wait=true; /確實(shí)有讀者在等待printf("等待的讀者%d正在讀n",rq.readersi);w = 0;for(j = 0;j < 300;j+)if(tempj = '0')printf("n");break;/ifprin

10、tf("%c",tempj);/forrq.readersi=0;rcount+;rq.index-;/if/forif(!reader_wait)/沒(méi)有讀者等待,看是否有寫者等待for(int i=0;i<=wq.index;i+)/檢查寫者等待隊(duì)列if(wq.writersi!=0)w = 0;printf("等待的寫者%d正在寫n請(qǐng)輸入要寫入的內(nèi)容",wq.writersi);scanf("%s",temp);wq.writersi=0;wcount-;break;/if/for/if/return;/ifelse/rco

11、unt != 0讀者正在讀,stop讀此時(shí)若有等待必為寫者rcount=0;w = 1;if(sign = 0)printf("緩沖區(qū)空 等待寫者n");return;elseprintf("讀者已經(jīng)讀完n");for(int i=0;i<=wq.index;i+)/檢查寫者等待隊(duì)列if(wq.writersi!=0)w = 0;printf("等待的寫者%d正在寫n請(qǐng)輸入要寫入的內(nèi)容",wq.writersi);scanf("%s",temp);wq.writersi=0;wcount-;break;/if

12、/for/else/*寫者優(yōu)先喚醒void WFwakeup()int i = 0;int j = 0;int m,n;m = rq.index;/n = wq.index;if(rcount = 0)/當(dāng)前無(wú)讀進(jìn)程,是寫者在寫 -停止運(yùn)行寫進(jìn)程bool writer_wait=false; w=1;printf("寫者已經(jīng)寫完n");sign = 1;/temp中已經(jīng)有內(nèi)容 要置1for(i=0;i<=wq.index;i+)/index為當(dāng)前寫者隊(duì)列中的等待進(jìn)程數(shù)if(wq.writersi!=0)writer_wait=true; /確實(shí)有寫者在等待printf

13、("等待的寫者%d正在寫n 請(qǐng)輸入要寫的內(nèi)容n",wq.writersi);w = 0;scanf("%s",temp);wq.writersi=0;wcount-;break;if(!writer_wait)/沒(méi)有xie者等待,看是否有du者等待for(int i=0;i<=m;i+)/檢查寫者等待隊(duì)列if(rq.readersi!=0)w = 0;printf("等待的讀者%d正在讀n",rq.readersi);for(j = 0;j < 300;j+)if(tempj = '0')printf(&q

14、uot;n");rq.index-;break;/ifprintf("%c",tempj);/forrq.readersi=0;rcount+;/if/for/if/return;/ifelse/rcount != 0讀者正在讀,stop讀此時(shí)若有等待必為寫者rcount=0;w = 1;printf("讀者已經(jīng)讀完n");for(int i=0;i<=wq.index;i+)/檢查寫者等待隊(duì)列if(wq.writersi!=0)w = 0;printf("等待的寫者%d正在寫n請(qǐng)輸入要寫入的內(nèi)容",wq.writer

15、si);scanf("%s",temp);wq.writersi=0;wcount-;break;/if/forvoid menu1()char i;printf(" 1-創(chuàng)建讀者進(jìn)程n 2-創(chuàng)建寫者進(jìn)程n 3-結(jié)束當(dāng)前執(zhí)行的進(jìn)程n 4-退出程序n");printf("*n");doprintf("當(dāng)前隊(duì)列中有讀者: %d個(gè) 寫者: %d個(gè)n",rq.index,wcount);printf("*n");printf(" ->");scanf("%s"

16、;,&i);switch(i)case '1':read();break;case '2':write();break;case '3':RFwakeup();break;case '4':exit(0);default:printf("輸入錯(cuò)誤請(qǐng)重新輸入n");while(true);void menu2()char i;printf(" 1-創(chuàng)建讀者進(jìn)程n 2-創(chuàng)建寫者進(jìn)程n 3-結(jié)束當(dāng)前執(zhí)行的進(jìn)程n 4-退出程序n");printf("*n");doprin

17、tf("當(dāng)前隊(duì)列中有讀者: %d個(gè) 寫者: %d個(gè)n",rq.index,wcount);printf("*n");printf(" ->");scanf("%s",&i);switch(i)case '1':read();break;case '2':write();break;case '3':WFwakeup();break;case '4':exit(0);default:printf("輸入錯(cuò)誤請(qǐng)重新輸入n"

18、);while(true);void main()printf("*n");printf(" 讀者與寫者實(shí)驗(yàn) n 1.讀者優(yōu)先n 2.寫者優(yōu)先n");scanf("%d",&choice);while(1)if(choice = 1)menu1();if(choice = 2)menu2();if(choice != 1 && choice != 2)printf("輸入錯(cuò)誤請(qǐng)重新輸入n");scanf("%d",&choice);實(shí)驗(yàn)流程圖:開(kāi)始退出寫者優(yōu)先讀者優(yōu)先結(jié)束寫者優(yōu)先喚醒讀者優(yōu)先喚醒寫操作讀操作是否有讀者在讀有寫者 讀者入隊(duì)是否有讀者在讀NYNNCPU是否空閑有讀者 寫者入隊(duì)YCpu是否空閑進(jìn)行讀操

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論