讀者寫者課程設(shè)計(jì)_第1頁
讀者寫者課程設(shè)計(jì)_第2頁
讀者寫者課程設(shè)計(jì)_第3頁
讀者寫者課程設(shè)計(jì)_第4頁
讀者寫者課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目 錄第一章 課程設(shè)計(jì)目的和要求11.1 課程設(shè)計(jì)目的11.2 課程設(shè)計(jì)要求1第二章 課程設(shè)計(jì)任務(wù)內(nèi)容22.1課程設(shè)計(jì)任務(wù)22.2課程設(shè)計(jì)內(nèi)容2第三章 詳細(xì)設(shè)計(jì)說明33.1問題描述33.2模塊設(shè)計(jì)33.3程序流程圖43.4算法與數(shù)據(jù)結(jié)構(gòu)53.4.1數(shù)據(jù)結(jié)構(gòu)53.4.2算法描述53.4.3算法流程圖6第四章 軟件使用說明104.1系統(tǒng)開發(fā)與運(yùn)行環(huán)境104.2系統(tǒng)的運(yùn)行說明104.3 運(yùn)行結(jié)果10第五章 課程設(shè)計(jì)心得體會(huì)15附錄1:參考文獻(xiàn)16附錄2:程序清單17第一章 課程設(shè)計(jì)目的和要求1.1 課程設(shè)計(jì)目的操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)的核心和靈魂,是計(jì)算機(jī)系統(tǒng)必不可少的組成部分,也是計(jì)算機(jī)專業(yè)教學(xué)的重要

2、內(nèi)容。該課程概念眾多、內(nèi)容抽象、靈活性與綜合性強(qiáng),不但需要理解操作系統(tǒng)的概念和原理,還需要加強(qiáng)操作系統(tǒng)實(shí)驗(yàn),上機(jī)進(jìn)行編程實(shí)踐,故進(jìn)行此次課程設(shè)計(jì),使我們更好地掌握操作系統(tǒng)的精髓,真正做到深刻理解和融會(huì)貫通。 操作系統(tǒng)課程設(shè)計(jì)是本課程重要的實(shí)踐教學(xué)環(huán)節(jié)。課程設(shè)計(jì)的目的,一方面使學(xué)生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面,通過課程設(shè)計(jì)加強(qiáng)學(xué)生的實(shí)驗(yàn)手段與實(shí)踐技能,培養(yǎng)學(xué)生獨(dú)立分析問題、解決問題、應(yīng)用知識(shí)的能力和創(chuàng)新精神。此次課程設(shè)計(jì)給學(xué)生更多自行設(shè)計(jì)、自主實(shí)驗(yàn)的機(jī)會(huì),充分放手讓學(xué)生真正培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力,全面提高學(xué)生的綜合素質(zhì)。本次課程設(shè)計(jì)的題目為讀者寫者同步問題的實(shí)

3、現(xiàn),在熟練掌握進(jìn)程同步原理的基礎(chǔ)上,利用C程序設(shè)計(jì)語言在windows操作系統(tǒng)下模擬實(shí)現(xiàn)讀者寫者同步問題的功能,一方面加深對原理的理解,另一方面提高根據(jù)已有原理通過編程解決實(shí)際問題的能力,為進(jìn)行系統(tǒng)軟件開發(fā)和針對實(shí)際問題提出高效的軟件解決方案打下基礎(chǔ)。1.2 課程設(shè)計(jì)要求在深入理解操作系統(tǒng)基本原理的基礎(chǔ)上,對于選定的題目以小組為單位,先確定設(shè)計(jì)方案,設(shè)計(jì)系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu),設(shè)計(jì)每個(gè)模塊的處理流程。要求設(shè)計(jì)合理,編程序?qū)崿F(xiàn)系統(tǒng),要求實(shí)現(xiàn)可視化的運(yùn)行界面,界面應(yīng)清楚地反映出系統(tǒng)的運(yùn)行結(jié)果,確定測試方案,對系統(tǒng)進(jìn)程測試,運(yùn)行系統(tǒng)并要通過驗(yàn)收,講解運(yùn)行結(jié)果,說明系統(tǒng)的特色和創(chuàng)新之處,并提交課程設(shè)

4、計(jì)報(bào)告。第2章 課程設(shè)計(jì)任務(wù)內(nèi)容2.1課程設(shè)計(jì)任務(wù)要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說明書撰寫等具體要求)1技術(shù)要求: 1)為每個(gè)讀者寫者產(chǎn)生一個(gè)線程,設(shè)計(jì)正確的同步算法; 2)讀者應(yīng)有3個(gè)以上,寫者應(yīng)有有兩個(gè)以上; 3) 必須包含讀者優(yōu)先喚醒和寫者優(yōu)先喚醒兩種算法。2設(shè)計(jì)說明書內(nèi)容要求: 1)設(shè)計(jì)題目與要求; 2)總的設(shè)計(jì)思想及系統(tǒng)平臺(tái)、語言、工具等; 3)數(shù)據(jù)結(jié)構(gòu)與模塊說明(功能與流程圖); 4)運(yùn)行結(jié)果與運(yùn)行情況。2.2課程設(shè)計(jì)內(nèi)容 本次課程設(shè)計(jì)是實(shí)現(xiàn)讀者寫者的同步與互斥問題,要求實(shí)現(xiàn)讀者與讀者可以共享資源,讀者與寫者互斥,寫者與寫者互斥,要求編寫出完整的代碼,

5、并截取運(yùn)行結(jié)果截圖。 第3章 詳細(xì)設(shè)計(jì)說明3.1問題描述 所謂讀者寫著問題,是指保證一個(gè)writer進(jìn)程必須與其他進(jìn)程互斥地訪問共享對象的同步問題。讀者寫者問題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個(gè)讀者可以同時(shí)讀這本書,但是,只能有一個(gè)寫者在寫書。為實(shí)現(xiàn)讀寫同步,需要使用信號(hào)量機(jī)制。信號(hào)量機(jī)制是支持多道程序的并發(fā)操作系統(tǒng)設(shè)計(jì)中解決資源共享時(shí)進(jìn)程間的同步與互斥的重要機(jī)制,而讀者寫者則是這一機(jī)制的一個(gè)經(jīng)典范例。對利用信號(hào)量來解決讀者寫者問題的描述如下: 1)寫-寫互斥,即不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作; 2)讀-寫互斥,即不能同時(shí)有一個(gè)讀者在讀,同時(shí)卻有一個(gè)寫

6、者在寫;3)讀讀允許,即可以有2個(gè)以上的讀者同時(shí)讀。 本次課程設(shè)計(jì)中,在處理讀者寫者等待隊(duì)列的請求時(shí),用到了兩種喚醒進(jìn)程算法:讀者優(yōu)先喚醒算法和寫者優(yōu)先喚醒算法。 讀優(yōu)先:當(dāng)一個(gè)讀者與若干寫者同時(shí)處于等待隊(duì)列中時(shí),并且此時(shí)并無寫操作進(jìn)行時(shí),讀者優(yōu)先進(jìn)行讀。 寫優(yōu)先:當(dāng)一個(gè)讀者與若干寫者同時(shí)處于等待隊(duì)列中時(shí),并且此時(shí)并無寫操作進(jìn)行時(shí),寫者優(yōu)先進(jìn)行寫。3.2模塊設(shè)計(jì)1. 程序由三部分組成:1) 主程序:顯示主菜單,調(diào)用各個(gè)子菜單;2) 讀者優(yōu)先喚醒:寫者釋放資源時(shí),優(yōu)先喚醒等待隊(duì)列中的讀進(jìn)程;3) 寫者優(yōu)先喚醒:寫者釋放資源時(shí),優(yōu)先喚醒等待隊(duì)列中的寫進(jìn)程。 主程序讀者優(yōu)先喚醒寫者優(yōu)先喚醒 退 出

7、圖3-1模塊劃分圖3.3程序流程圖 結(jié) 束 讀者優(yōu)先喚醒 開始顯示主菜單輸入choiceChoice=1?Choice=2?Choice=3? 寫者優(yōu)先喚醒 退出NNNYYY圖3-2為本次課程設(shè)計(jì)的程序流程圖,其中choice為一整型變量,由使用者通過鍵盤輸入: 圖3-2程序流程圖3.4算法與數(shù)據(jù)結(jié)構(gòu)3.4.1數(shù)據(jù)結(jié)構(gòu)1. 定義一個(gè)結(jié)構(gòu)體,用來存放讀者等待隊(duì)列,其元素為用來存放讀進(jìn)程的數(shù)組reader200,用來指示等待隊(duì)列中讀進(jìn)程個(gè)數(shù)的整型變量index:struct rqueue int readers200;int index;rq;2. 定義另一個(gè)結(jié)構(gòu)體,用來存放寫者等待隊(duì)列,其元素為

8、用來存放寫進(jìn)程的數(shù)組writers200;用來指示等待隊(duì)列中寫進(jìn)程個(gè)數(shù)的整型變量index:struct wqueue int writers200;int index;wq;3.4.2算法描述1. 定義一個(gè)數(shù)據(jù)緩存buffer及用于實(shí)現(xiàn)同步互斥的信號(hào)量w。2. 定義一個(gè)讀者函數(shù):1) 當(dāng)有寫者在占用buffer時(shí),讀者應(yīng)該等待,直到寫者不再使用該buffer;2) 當(dāng)有其他讀者在占用buffer時(shí),讀者可對buffer進(jìn)行讀取操作;3) 當(dāng)buffer中有數(shù)據(jù)時(shí),則從其中讀取一個(gè)數(shù)據(jù),并顯示然后退出;4) 當(dāng)buffer中沒有數(shù)據(jù)時(shí),應(yīng)等待,直到buffer中有數(shù)據(jù)可讀,用變量sign指示,

9、為1時(shí)才能讀;為0時(shí)需要等待寫者寫數(shù)據(jù)。3. 定義一個(gè)寫者函數(shù):1) 當(dāng)有讀者在占用buffer時(shí),寫者應(yīng)該等待,直到所有的讀者都退出為止;2) 當(dāng)有其他寫者占用buffer時(shí),該寫者應(yīng)該等待,直到占用buffer的寫者退出為止;3) 當(dāng)buffer有空閑時(shí),寫者應(yīng)該在buffer中寫入一個(gè)數(shù)據(jù)并退出。4. 定義主函數(shù),在其中可以任意創(chuàng)建讀者與寫者。 可根據(jù)用戶輸入創(chuàng)建讀者或?qū)懻哌M(jìn)程(線程)。3.4.3 算法流程圖1) 讀操作算法流程圖如圖3-3所示:Y 開 始Rcount=0? w=1? sign=1? W=0;rcount+; 進(jìn)行讀等待寫者寫內(nèi)容;并加入到讀者喚醒隊(duì)列;Rq.index+

10、; 結(jié)束YYNNN 圖3-3讀者算法流程圖注:Rcount表示正在進(jìn)行讀操作的數(shù)目;w表示一個(gè)信號(hào)量,為1時(shí)表示無進(jìn)程操作,緩沖區(qū)空閑,為0時(shí)表示有進(jìn)程占用;sign表示緩沖區(qū)是否有數(shù)寫入,只有緩沖區(qū)中有數(shù)才能進(jìn)行讀操作,為1表示有數(shù),為0表示沒有;Rq.index表示讀操作等待喚醒隊(duì)列進(jìn)程數(shù);2) 寫操作算法流程圖如圖3-4所示: 開 始 W=1? W-;進(jìn)行寫;加入寫喚醒隊(duì)列Wq.index+; 結(jié)束NY 圖3-4寫者算法流程圖注:w含義同上;Wq.index表示寫操作等待喚醒隊(duì)列進(jìn)程數(shù)。3) 讀者優(yōu)先喚醒算法流程圖如圖3-5所示:讀者優(yōu)先喚醒是指當(dāng)寫者釋放其占有的資源時(shí),當(dāng)讀者和寫者同時(shí)

11、有進(jìn)程等待,優(yōu)先處理讀進(jìn)程。圖3-5注:Rcount.w.Wq.index含義同上;reader_wait是布爾型變量,為真時(shí)表示有讀者等待,反之沒有讀者進(jìn)程等待。4) 寫者優(yōu)先喚醒算法流程圖如圖3-6所示:寫者優(yōu)先喚醒是指當(dāng)寫進(jìn)程釋放其占有資源時(shí),當(dāng)讀者和寫者同時(shí)有進(jìn)程等待,優(yōu)先處理寫進(jìn)程。圖3-6注:Rcount,w,Wq.index含義同上;write_wait是一個(gè)布爾型變量,為真時(shí)表示有寫進(jìn)程等待,反之沒有。NNYNNYYYYWq.index=0? 處理隊(duì)列首部的寫進(jìn)程N(yùn)!reader_wait? 開始 Rcount=0?reader_wait=false;w=1; 結(jié)束當(dāng)前寫進(jìn)程R

12、q.index=0? reader_wait=true; W=0;處理讀進(jìn)程Wq.index!=0? Rcount=0; W=1;處理寫進(jìn)程 W=0; 結(jié)束 圖3-5讀者優(yōu)先喚醒算法流程圖YNNYYYNNY 開始 Rcount=0?write_wait=false;w=1; 結(jié)束當(dāng)前寫進(jìn)程Wq.index=0? write_wait=true; W=0;依次處理寫進(jìn)程Wq.index!=0? Rcount=0; W=1;處理寫進(jìn)程 W=0;!write_wait?Rq.index=0? 處理讀進(jìn)程; w=0 結(jié)束N 圖3-6 寫者優(yōu)先喚醒算法流程圖第四章 軟件使用說明4.1系統(tǒng)開發(fā)與運(yùn)行環(huán)境

13、代碼實(shí)現(xiàn):C語言程序開發(fā)工具:Mcrosoft Visual C + 6.0 運(yùn)行環(huán)境:windows 7 4.2系統(tǒng)的運(yùn)行說明對讀者寫者問題系統(tǒng)的運(yùn)行說明如下:按照顯示菜單說明,輸入數(shù)字對菜單進(jìn)行選擇,一個(gè)菜單即是一個(gè)功能實(shí)現(xiàn),可以實(shí)現(xiàn)讀者寫者進(jìn)程同步與互斥問題。4.3 運(yùn)行結(jié)果1. 系統(tǒng)主菜單及讀者優(yōu)先喚醒子菜單,按菜單提示選擇1是讀者優(yōu)先喚醒算法,運(yùn)行結(jié)果如圖4-1所示: 圖4-1主菜單及子菜單2. 在子菜單中選擇1創(chuàng)建讀進(jìn)程,由于此之前并無寫者向緩沖區(qū)中寫數(shù),所以緩沖區(qū)為空,此時(shí)不可讀,將讀者加入到等待喚醒隊(duì)列,讀者隊(duì)列數(shù)目加1,運(yùn)行結(jié)果如圖4-2所示: 圖4-2 創(chuàng)建讀進(jìn)程3. 在子

14、菜單中選擇2創(chuàng)建寫進(jìn)程1,由于并無進(jìn)程占用緩沖區(qū),所以寫者1不必等待可以直接寫數(shù),運(yùn)行結(jié)果如圖4-3所示: 圖4-3 創(chuàng)建寫進(jìn)程4. 在子菜單中選擇1創(chuàng)建讀者進(jìn)程,由于已有寫進(jìn)程占用所以將讀者進(jìn)程加入到讀者等待喚醒隊(duì)列;選擇創(chuàng)建寫者進(jìn)程2,由于寫者與寫者互斥,將寫者2加入到寫者等待喚醒隊(duì)列,運(yùn)行結(jié)果如圖4-4所示: 圖 4-4創(chuàng)建讀進(jìn)程和寫進(jìn)程5. 選擇3寫者1釋放資源,由于此為讀者優(yōu)先喚醒算法,所以優(yōu)先喚醒讀者,進(jìn)行讀進(jìn)程操作,運(yùn)行結(jié)果如圖4-5所示: 圖 4-5寫者釋放占有資源優(yōu)先喚醒讀者6. 選擇1創(chuàng)建讀進(jìn)程,讀者與讀者之間不互斥,所以不必等待;選擇2創(chuàng)建寫進(jìn)程3,由于讀進(jìn)程占用資源,所

15、以寫者必須等待,將寫者加入等待隊(duì)列,運(yùn)行結(jié)果如圖4-6所示: 圖 4-6 創(chuàng)建讀進(jìn)程和寫進(jìn)程7. 選擇3讀者釋放資源,寫者2被喚醒進(jìn)行寫操作,運(yùn)行結(jié)果如圖4-7所示: 圖 4-7 讀者釋放占有資源8. 返回到主菜單并選擇寫者優(yōu)先喚醒算法,運(yùn)行結(jié)果如圖4-8所示: 圖 4-8 寫者優(yōu)先喚醒算法9. 選擇3釋放當(dāng)前進(jìn)程,等待隊(duì)列中的寫者喚醒,運(yùn)行結(jié)果如圖4-9所示: 圖 4-9 釋放寫者2,寫者3占有資源10. 創(chuàng)建兩個(gè)讀進(jìn)程和一個(gè)寫者進(jìn)程,由于寫者3占有資源,所以它們都要加入各自等待喚醒隊(duì)列中,運(yùn)行結(jié)果如圖4-10所示: 圖4-10 創(chuàng)建讀進(jìn)程和寫進(jìn)程11. 釋放當(dāng)前寫者占有資源,由于本算法使用

16、的是寫者優(yōu)先喚醒算法,所以寫者4優(yōu)先被喚醒占用資源,進(jìn)行寫操作,讀者進(jìn)程依然等待,運(yùn)行結(jié)果如圖4-11所示: 圖4-11寫者釋放資源優(yōu)先喚醒等待隊(duì)列中的寫者第五章 課程設(shè)計(jì)心得體會(huì) 三周的課程設(shè)計(jì)結(jié)束了,這次課程設(shè)計(jì)是操作系統(tǒng)中讀者與寫者問題。通過課程設(shè)計(jì)我懂得了讀者與寫者的一些簡單算法的實(shí)現(xiàn),掌握了用高級(jí)語言編寫和調(diào)試程序的方法,加深了對讀者寫者問題概念及算法的理解,并且加深了對進(jìn)程同步算法的理解。同時(shí),在這次課程設(shè)計(jì)中,也暴露出一些問題,比如動(dòng)手之前的構(gòu)思是非常的完美,本來以為會(huì)一氣呵成的順利完成任務(wù),可是正是需要?jiǎng)邮肿龅脮r(shí)候卻是那么困難,尤其是編寫代碼的時(shí)候,編完運(yùn)行老是出錯(cuò),然后改正,

17、還是出錯(cuò),總是在那些細(xì)節(jié)上出錯(cuò),問題雖然不大,但就是不能運(yùn)行。所以,平時(shí)還是要多動(dòng)手,注意要認(rèn)真細(xì)心。最后,感謝老師對我的學(xué)習(xí)的指導(dǎo)!附錄1:參考文獻(xiàn)1 胡志剛,譚長庚等,計(jì)算機(jī)操作系統(tǒng),中南大學(xué)出版社2005年2 羅宇,鄒鵬等,操作系統(tǒng)(第二版),電子工業(yè)出版社2007年4月3 湯子瀛,哲風(fēng)屏,湯小冉等,計(jì)算機(jī)操作系統(tǒng),西安電子科技大學(xué)出社,2001年8月4 張堯?qū)W,史美林,計(jì)算機(jī)操作系統(tǒng)課程,清華大學(xué)出版社,2000年5 龐麗萍,操作系統(tǒng)原理,華中理工大學(xué)出版社,2000年6 馬季蘭等Linux操作系統(tǒng),電子工業(yè)出版社2002年7 任愛華,李鵬,劉方毅,操作系統(tǒng)實(shí)驗(yàn)指導(dǎo),清華大學(xué)出版社,2

18、004年8 譚浩強(qiáng)著.C程序設(shè)計(jì),清華大學(xué)出版社,1999年12月第2版9 譚浩強(qiáng)著.C+程序設(shè)計(jì)實(shí)踐指導(dǎo),清華大學(xué)出版社,2005年7月底1版10【美】D.C.Malik:C+編程從問題分析到程序設(shè)計(jì),電子工業(yè)出版社,2003年7月第一版附錄2:程序清單源代碼:#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)量;int choic

19、e; /用戶選擇讀者優(yōu)先或者寫者優(yōu)先int sign=0; /標(biāo)識(shí)緩沖區(qū)是否為空,0表示空,1表示不為空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

20、read()int i = 0;read_id+;if(rcount = 0) /當(dāng)前沒有讀進(jìn)程在讀:可能有寫進(jìn)程在寫,也可能CPU空閑if(w=1) /如果CPU空閑,讀者拿到獲得cpuw-; /相當(dāng)于一個(gè)P操作rcount+;if(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

21、);/ifelse /寫者線程正在執(zhí)行printf("!有寫者在寫不能讀!n");rq.readersrq.index+=read_id; /將讀者進(jìn)程加入等待隊(duì)列/else/ifelse /rcount !=1 則知道當(dāng)前已經(jīng)有讀者在讀,讀讀不互斥,則這個(gè)讀者可以直接進(jìn)來了讀printf("讀者%d正在讀n",read_id);/else/*寫進(jìn)程寫操作void write()write_id+;if(w = 0)if(rcount != 0 ) /有讀者進(jìn)程在執(zhí)行printf("!有讀者在讀不能寫!n");wq.writerswq

22、.index+=write_id; /將寫者進(jìn)程加入等待隊(duì)列wcount+;return;if(rcount = 0 ) /rcount = 0則當(dāng)前無讀者,但w = 0,所以有寫者在寫printf("!有寫者在寫不能寫!n");wq.writerswq.index+=write_id; /將寫者進(jìn)程加入等待隊(duì)列wcount+;return;if(w = 1)w-;printf("寫者%d正在寫n",write_id);sign=1;/if/*讀者優(yōu)先時(shí)喚醒進(jìn)程void RFwakeup()int i = 0;int j = 0;int m;m = rq

23、.index;/n = wq.index;if(rcount = 0) /當(dāng)前無讀進(jìn)程,是寫者在寫停止運(yùn)行寫進(jìn)程bool reader_wait=false; w=1;printf("寫者已經(jīng)寫完n");sign = 1; /緩沖區(qū)中已經(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;rq.readersi=0;rcount+;rq.index

24、-;/if/forif(!reader_wait) /沒有讀者等待,看是否有寫者等待for(int i=0;i<=wq.index;i+) /檢查寫者等待隊(duì)列if(wq.writersi!=0)w = 0;printf("等待的寫者%d正在寫n",wq.writersi);wq.writersi=0;wcount-;break;/if/for/if/ifelse /若rcount != 0則讀者正在讀,停止讀者進(jìn)程,此時(shí)若有等待必為寫者rcount=0;w = 1;if(sign = 0)printf("緩沖區(qū)空,等待寫者n");return;el

25、seprintf("讀者已經(jīng)讀完n");for(int i=0;i<=wq.index;i+) /檢查寫者等待隊(duì)列if(wq.writersi!=0)w = 0;printf("等待的寫者%d正在寫n",wq.writersi);wq.writersi=0;wcount-;break;/if/for/else/else/*寫者優(yōu)先喚醒void WFwakeup()int i = 0;int j = 0;int m;m = rq.index;/n = wq.index;if(rcount = 0) /當(dāng)前無讀進(jìn)程,是寫者在寫則停止運(yùn)行寫進(jìn)程bool

26、writer_wait=false; w=1;printf("寫者已經(jīng)寫完n");sign = 1; /緩沖區(qū)已經(jīng)有內(nèi)容sign要置1for(i=0;i<=wq.index;i+) /index為當(dāng)前寫者隊(duì)列中的等待進(jìn)程數(shù) if(wq.writersi!=0)writer_wait=true; /確實(shí)有寫者在等待printf("等待的寫者%d正在寫n ",wq.writersi);w = 0;wq.writersi=0;wcount-;break;if(!writer_wait) /沒有寫者等待,看是否有讀 者等待for(int i=0;i<

27、=m;i+) /檢查讀者者等待隊(duì)列if(rq.readersi!=0)w = 0;printf("等待的讀者%d正在讀n",rq.readersi);rq.readersi=0;rcount+;/if/for/if/ifelse /rcount != 0有讀者正在讀,則停止讀;此時(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",wq.

28、writersi);wq.writersi=0;wcount-;break;/if/forvoid menu1()void menu();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",&i);switch(i)case '1':read();break;case '2':write();break;case '3&#

溫馨提示

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

評論

0/150

提交評論