操作系統(tǒng)課設(shè)報(bào)告(共22頁)_第1頁
操作系統(tǒng)課設(shè)報(bào)告(共22頁)_第2頁
操作系統(tǒng)課設(shè)報(bào)告(共22頁)_第3頁
操作系統(tǒng)課設(shè)報(bào)告(共22頁)_第4頁
操作系統(tǒng)課設(shè)報(bào)告(共22頁)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)(co zu x tn)課程設(shè)計(jì)(2011/2012學(xué)年(xunin)第二學(xué)期(xuq)第20周)指導(dǎo)教師:XXX班級(jí): 學(xué)號(hào):姓名: 計(jì)算機(jī)操作系統(tǒng)(co zu x tn)A課程設(shè)計(jì)目 錄 TOC o 1-3 h z u HYPERLINK l _Toc328719859 一、題目(tm): PAGEREF _Toc328719859 h 3 HYPERLINK l _Toc328719860 二、目的(md)和設(shè)計(jì)要求: PAGEREF _Toc328719860 h 3 HYPERLINK l _Toc328719861 (1)、目的: PAGEREF _Toc328719861

2、 h 3 HYPERLINK l _Toc328719862 (2)設(shè)計(jì)要求: PAGEREF _Toc328719862 h 3 HYPERLINK l _Toc328719863 三、設(shè)計(jì)思想或方法: PAGEREF _Toc328719863 h 3 HYPERLINK l _Toc328719864 1.讀者優(yōu)先 PAGEREF _Toc328719864 h 3 HYPERLINK l _Toc328719865 2.寫者優(yōu)先 PAGEREF _Toc328719865 h 4 HYPERLINK l _Toc328719866 3.退出程序 PAGEREF _Toc32871986

3、6 h 4 HYPERLINK l _Toc328719867 四、實(shí)現(xiàn)的功能說明(相關(guān)API函數(shù)說明): PAGEREF _Toc328719867 h 4 HYPERLINK l _Toc328719868 五、設(shè)計(jì)流程圖: PAGEREF _Toc328719868 h 10 HYPERLINK l _Toc328719869 六、核心源程序代碼和界面圖: PAGEREF _Toc328719869 h 10 HYPERLINK l _Toc328719870 1、源程序代碼 PAGEREF _Toc328719870 h 10 HYPERLINK l _Toc328719871 2、主

4、菜單界面: PAGEREF _Toc328719871 h 17 HYPERLINK l _Toc328719872 3、讀者優(yōu)先界面: PAGEREF _Toc328719872 h 17 HYPERLINK l _Toc328719873 4、寫者優(yōu)先界面: PAGEREF _Toc328719873 h 18 HYPERLINK l _Toc328719874 七、實(shí)驗(yàn)心得與體會(huì): PAGEREF _Toc328719874 h 19一、題目(tm):讀者(dzh)寫者問題二、目的(md)和設(shè)計(jì)要求:(1)、目的: 理解讀者寫者問題的基本概念,讀寫操作限制; 掌握基于windows的多線

5、程編程的基本流程;實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先的調(diào)度算法;(2)設(shè)計(jì)要求:在windows 2000環(huán)境下,創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,此進(jìn)程包含n個(gè)線程。用這n個(gè)線程來表示n個(gè)讀者或?qū)懻?。每個(gè)線程按相應(yīng)測(cè)試數(shù)據(jù)文件(后面有介紹)的要求進(jìn)行讀寫操作。用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者寫者問題。讀者寫者問題的讀寫操作限制(包括讀者優(yōu)先和寫者優(yōu)先):讀者優(yōu)先/寫者優(yōu)先先來先服務(wù),避免并發(fā)搶占1)寫寫互斥,即不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作。2)讀寫互斥,即不能同時(shí)有一個(gè)線程在讀,而另一個(gè)線程在寫。3)讀讀允許,即可以有一個(gè)或多個(gè)讀者在讀。讀者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一個(gè)讀者正在進(jìn)

6、行讀操作,則該讀者可直接開始讀操作。寫者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。運(yùn)行結(jié)果顯示要求:要求在每個(gè)線程創(chuàng)建、發(fā)出讀寫操作申請(qǐng)、開始讀寫操作和結(jié)束讀寫操作時(shí)分別顯示一行提示信息,以確定所有處理都遵守相應(yīng)的讀寫操作限制。三、設(shè)計(jì)思想或方法:可以將所有讀者和所有寫者分別存于一個(gè)讀者等待隊(duì)列和一個(gè)寫者等待隊(duì)列中,每當(dāng)讀允許時(shí),就從讀者隊(duì)列中釋放一個(gè)或多個(gè)讀者線程進(jìn)行讀操作;每當(dāng)寫允許時(shí),就從寫者隊(duì)列中釋放一個(gè)寫者進(jìn)行寫操作。1.讀者優(yōu)先讀者優(yōu)先指的是除非有寫者在寫文件,否則讀者不需要等待。所以可以用個(gè)整

7、型變量readcount記錄當(dāng)前的讀者數(shù)目,用于確定是否需要釋放正在等待的寫者線程(當(dāng)readcount=0時(shí),表明所有的讀者讀完,需要釋放寫者等待隊(duì)列中的一個(gè)寫者)。每一個(gè)讀者開始讀文件時(shí),必須修改readcount變量。因此需要一個(gè)互斥對(duì)象h_Mutex來實(shí)現(xiàn)對(duì)全局變量readcount修改時(shí)的互斥。另外(ln wi),為了實(shí)現(xiàn)寫寫互斥,需要增加一個(gè)臨界區(qū)對(duì)象RP_Write。當(dāng)寫者發(fā)出寫請(qǐng)求時(shí),必須申請(qǐng)(shnqng)臨界區(qū)對(duì)象的所有權(quán)。通過這種方法,也可以實(shí)現(xiàn)讀寫互斥、當(dāng)readcount=1時(shí)(即第一個(gè)讀者到來時(shí)),讀者線程也必須申請(qǐng)(shnqng)臨界區(qū)對(duì)象的所有權(quán)。當(dāng)讀者擁有臨界

8、區(qū)的所有權(quán)時(shí),寫者阻塞在臨界區(qū)對(duì)象RP_Write上。當(dāng)寫者擁有臨界區(qū)的所有權(quán)時(shí),第一個(gè)讀者判斷完“readcount= =1”后阻塞在write上,其余的讀者由于等待對(duì)readcount的判斷,阻塞在mutex上。2.寫者優(yōu)先寫者優(yōu)先指的是除非有讀者在讀文件,否則寫者不需要等待,一旦有寫者,則后續(xù)讀者必須等待,喚醒時(shí)優(yōu)先考慮寫者。所以用一個(gè)整形變量writecount記錄當(dāng)前的寫者數(shù)目,用于確定是否需要釋放正在等待的讀者線程(當(dāng)writecount=0時(shí),表明所有的寫者寫完,需要釋放讀者等待隊(duì)列中的一個(gè)寫者)。,每一個(gè)寫者開始讀文件時(shí),必須修改writecount變量,因此需要一個(gè)互斥對(duì)象h

9、_Mutex2來實(shí)現(xiàn)對(duì)全局變量writecount修改時(shí)的互斥。另外需要一個(gè)整形變量readcount記錄寫者申請(qǐng)前的讀者數(shù)目,用于確定是否需要釋放正在等待的寫者線程(當(dāng)readcount=0時(shí),表明所有的讀者讀完,需要釋放寫者等待隊(duì)列中的一個(gè)寫者,后續(xù)的讀者線程繼續(xù)等待)。每一個(gè)讀者開始讀文件時(shí),必須修改readcount變量。因此需要一個(gè)互斥對(duì)象h_Mutex1來實(shí)現(xiàn)對(duì)全局變量readcount修改時(shí)的互斥。為了實(shí)現(xiàn)讀-寫互斥,需要增加一個(gè)臨界區(qū)對(duì)象cs_Read。當(dāng)讀者發(fā)出讀請(qǐng)求時(shí),必須申請(qǐng)到臨界區(qū)對(duì)象的所有權(quán)。通過這種方法,也可以實(shí)現(xiàn)寫者來后續(xù)讀者等待,當(dāng)讀者發(fā)出讀請(qǐng)求時(shí),等待隊(duì)列中已

10、有一個(gè)寫者在等待,則必須申請(qǐng)到臨界區(qū)對(duì)象的所有權(quán)。另外,為了實(shí)現(xiàn)寫-寫互斥和讀者先來寫者等待,需要增加一個(gè)臨界區(qū)對(duì)象cs_Write。寫者優(yōu)先和讀者優(yōu)先有相同之處,不同的地方在:一旦有一個(gè)寫者到來時(shí),應(yīng)該盡快讓寫者進(jìn)行寫,如果有一個(gè)寫者在等待,則新到的讀者操作不能讀操作,為此添加一個(gè)整型變量writecount,記錄寫者的數(shù)目,當(dāng)writecount=0時(shí)才可以釋放讀者進(jìn)行讀操作!為了實(shí)現(xiàn)對(duì)全局變量writecount的互斥訪問,設(shè)置了一個(gè)互斥對(duì)象Mutex3。為了實(shí)現(xiàn)寫者優(yōu)先,設(shè)置一個(gè)臨界區(qū)對(duì)象read,當(dāng)有寫者在寫或等待時(shí),讀者必須阻塞在臨界區(qū)對(duì)象read上。讀者除了要一個(gè)全局變量read

11、count實(shí)現(xiàn)操作上的互斥外,還需要一個(gè)互斥對(duì)象對(duì)阻塞在read這一個(gè)過程實(shí)現(xiàn)互斥,這兩個(gè)互斥對(duì)象分別為mutex1和mutex2。3.退出程序選擇退出程序后,按任意鍵即可結(jié)束程序。四、實(shí)現(xiàn)(shxin)的功能說明(相關(guān)(xinggun)API函數(shù)說明):1.CreateThread函數(shù)(hnsh)功能:該函數(shù)創(chuàng)建一個(gè)在調(diào)用進(jìn)程的地址空間中執(zhí)行的線程。函數(shù)原型:HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress

12、,LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);參數(shù):lpThreadAttributes:指向一個(gè)LPSECURITY_ATTRIBUTES結(jié)構(gòu)。該結(jié)構(gòu)決定了返回的句柄是否可被子進(jìn)程繼承。若lpThreadAttributes為NULL,則句柄不能被繼承。在Windows NT中該結(jié)構(gòu)的lpSecurityDescriptor成員定義了新進(jìn)程的安全性描述符。若lpThreadAttributes為NULL。則線程獲得個(gè)默認(rèn)的安全性描述符。dwStackSize:定義原始堆棧提交時(shí)的大小(按字節(jié)計(jì))。系統(tǒng)將該值舍入

13、為最近的頁。若該值為0,或小于默認(rèn)時(shí)提交的大小,默認(rèn)情況是使用與調(diào)用線程同樣的大小更多的信息,請(qǐng)看Thread Stack Size。lpStartAddress:指向一個(gè)LPTHREAD_START_ROUTINE類型的應(yīng)用定義的函數(shù),該線程執(zhí)行此函數(shù)。該指針還表示遠(yuǎn)程進(jìn)程中線程的起始地址。該函數(shù)必須存在于遠(yuǎn)程進(jìn)程中。lpParameter:定義一個(gè)傳遞給該進(jìn)程的32位值。dwCreationFlags:定義控制進(jìn)程創(chuàng)建的附加標(biāo)志。若定義了CREATE_SUSPENDED標(biāo)志,線程創(chuàng)建時(shí)處于掛起狀態(tài),并且直到ResumeThread函數(shù)調(diào)用時(shí)才能運(yùn)行。若該值為0,則該線程在創(chuàng)建后立即執(zhí)行。l

14、pThreadId:指向個(gè)32位值,它接收該線程的標(biāo)識(shí)符。返回值:若函數(shù)調(diào)用成功,返回值為新線程的句柄;若函數(shù)調(diào)用失敗,返回值為NULL。備注:新進(jìn)程的句柄創(chuàng)建時(shí)設(shè)為THREAD_ALL_ACCESS訪問權(quán)限。若未提供安全性描述符,則該句柄可被任何要求一個(gè)線程對(duì)象句柄的函數(shù)所使用。若提供了安全性描述符,則以后使用該句柄時(shí),將在授權(quán)訪問以前執(zhí)行訪問檢查。若訪問檢查拒絕訪問,則請(qǐng)求進(jìn)程不能使用該句柄獲得對(duì)該線程的訪問。線程從lpStartAddress參數(shù)定義的函數(shù)處開始執(zhí)行。若該函數(shù)返回,系統(tǒng)將默認(rèn)地認(rèn)為以調(diào)用ExitThread函數(shù)的方法終止該線程。使用GetExitcodeThread函數(shù)來

15、獲得線程的返回值。線程創(chuàng)建時(shí)擁有THREAD_PRIORITY_NORMAL優(yōu)先權(quán)。使用GetThreadPriority和SetThreadPriority函數(shù)可以獲得和設(shè)置線程的優(yōu)先權(quán)值。一個(gè)線程終止時(shí)。該線程對(duì)象被設(shè)為發(fā)信號(hào)狀態(tài),以滿足在該對(duì)象上等待的所有進(jìn)程。一個(gè)線程對(duì)象始終存在于系統(tǒng)中,直到該線程終止,且它所有的句柄都已通過(tnggu)調(diào)用CloseHandle函數(shù)關(guān)閉。2.Sleep函數(shù)(hnsh)功能:該函數(shù)對(duì)于指定的時(shí)間(shjin)間隔掛起當(dāng)能的執(zhí)行線程。函數(shù)原型:VOID Sleep (DWORD dwMulliseconds);參數(shù):dwMilliseconds:定義掛

16、起執(zhí)行線程的時(shí)間,以毫秒(ms)為單位。取值為0時(shí),該線程將余下的時(shí)間片交給處于就緒狀態(tài)的同一優(yōu)先級(jí)的其他線程。若沒有處于就緒狀態(tài)的同一優(yōu)先級(jí)的其他線程,則函數(shù)立即返回,該線程繼續(xù)執(zhí)行。若取值為INFINITE則造成無限延遲。返回值:該函數(shù)沒有返回值。備注:一個(gè)線程可以在調(diào)用該函數(shù)時(shí)將睡眠時(shí)間設(shè)為0ms,以將剩余的時(shí)間片交出。3.CreateMutex函數(shù)功能:該函數(shù)創(chuàng)建有名或者無名的互斥對(duì)象。函數(shù)原型:HANDLE CreateMutex (LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner, LPCTSTR lpName);

17、參數(shù):lpMutexAttributes:指向SECURITY_ATTRIBUTES結(jié)構(gòu)的指針,該結(jié)構(gòu)決定子進(jìn)程是否能繼承返回句柄。如果lpMutexAttributes為NULL,那么句柄不能被繼承。在Windows NT中該結(jié)構(gòu)的LpSecuriyDescriptor成員指定新互斥對(duì)象的安全描述符。如果lpMutexAttributes為NULL,那么互斥對(duì)象獲得默認(rèn)的安全描述符。bInitialOwner:指定互斥對(duì)象的初始所屬身份。如果該值為TRUE,并且調(diào)用者創(chuàng)建互斥對(duì)象,那么調(diào)用線程獲得互斥對(duì)象所屬身份。否則,調(diào)用線程不能獲得互斥對(duì)象所屬身份。判斷調(diào)用者是否創(chuàng)建互斥對(duì)象清參閱返回值

18、部分。lpName:指向以NULL結(jié)尾的字符串,該字符串指定了互斥對(duì)象名。該名字的長度小于MAX_PATH且可以包含除反斜線()路徑分隔符以外的任何字符。名字是區(qū)分大小寫的。如果lpName與已存在的有名互斥對(duì)象名相匹配,那么該函數(shù)要求用MUTEX_ALL_ACCESS權(quán)限訪問已存在的對(duì)象。在這種情況下,由于參數(shù)bInitialOwner已被創(chuàng)建進(jìn)程所設(shè)置,該參數(shù)被忽略。如果參數(shù)lpMutexAttributes不為NULL,它決定句柄是否解除繼承,但是其安全描述符成員被忽略。如果lpName為NULL,那么創(chuàng)建的互斥對(duì)象無名。如果lpName與已存在的事件、信號(hào)量、可等待定時(shí)器、作業(yè)(zuy

19、)或者義件映射對(duì)象的名字相匹配,那么函數(shù)調(diào)用失敗,并且 GetLastError函數(shù)返回ERROR_ALREADY_HANDLE,其原因是這些對(duì)象共享相同的名字空間。返回值:如果函數(shù)調(diào)用成功,返回值是互斥對(duì)象句柄;如果函數(shù)調(diào)用之前,有名(yu mng)互斥對(duì)象已存在,那么函數(shù)給已存在的對(duì)象返回一個(gè)句柄,并且函數(shù)GetLastError返回ERROR_ ALREADY_EXISTS。否則,調(diào)用者創(chuàng)建互斥對(duì)象。如果(rgu)函數(shù)調(diào)用失敗,則返回值為NULL。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。備注:由函數(shù)CreateMutex返回的句柄有MUTEX_ALL_ACCESS權(quán)限可

20、以去訪問新的互斥對(duì)象,并且可用在請(qǐng)求互斥對(duì)象句柄的任何函數(shù)中。調(diào)用進(jìn)程中的任何線程可以在調(diào)用等待函數(shù)時(shí)指定互斥對(duì)象句柄。當(dāng)指定對(duì)象的狀態(tài)為信號(hào)態(tài)時(shí)。返回單對(duì)象等待函數(shù)。當(dāng)任何一個(gè)或者所有的互斥對(duì)象都為信號(hào)態(tài)時(shí),返回多對(duì)象等待函數(shù)指令。等待函數(shù)返回后,等待的線程被釋放,繼續(xù)向下執(zhí)行。當(dāng)一個(gè)互斥對(duì)象不被任何線程擁有時(shí),處于信號(hào)態(tài)。創(chuàng)建該對(duì)象的線程可以使用bInitialOwner標(biāo)志來請(qǐng)求立即獲得對(duì)該互斥對(duì)象的所有權(quán)。否則,線程必須使用等待函數(shù)來請(qǐng)求所有權(quán)。當(dāng)互斥對(duì)象處于信號(hào)態(tài),等待的線程獲得對(duì)該對(duì)象的所有權(quán)時(shí),此互斥對(duì)象的狀態(tài)被設(shè)置為非信號(hào)態(tài),等待函數(shù)返回。任意時(shí)刻,僅有一個(gè)線程能擁有該互斥對(duì)象

21、線程可以使用ReleaseMutex函數(shù)來釋放對(duì)這個(gè)互斥對(duì)象的所有權(quán)。總線程已經(jīng)擁有了個(gè)互斥對(duì)象,那么它可以重復(fù)調(diào)用等待函數(shù)而不會(huì)發(fā)生阻塞,一般情況下,用戶不會(huì)重復(fù)等待同一個(gè)互斥對(duì)象,這種機(jī)制防止了線程因等待它已經(jīng)擁有的互斥對(duì)象而發(fā)生死鎖。然而,線程必須為每一次等待調(diào)用次ReleaseMutex函數(shù)來釋放該互斥對(duì)象。兩個(gè)或多個(gè)進(jìn)程可以調(diào)用CreateMutex來創(chuàng)建同名的互斥對(duì)象,第一個(gè)進(jìn)程實(shí)際創(chuàng)建互斥對(duì)象以后的進(jìn)程打開已存在的互斥對(duì)象的句柄。這使得多個(gè)進(jìn)程可以得到同一個(gè)互斥對(duì)象的句柄,從而減輕了用戶的負(fù)擔(dān),使用戶不必判斷創(chuàng)建進(jìn)程是否為第一個(gè)啟動(dòng)的進(jìn)程。使用這種技術(shù)時(shí),應(yīng)該把bInitialO

22、wner標(biāo)志設(shè)為FALSE;否則很難確定開始時(shí)哪一個(gè)進(jìn)程擁有該互斥對(duì)象。由于多進(jìn)程能夠擁有相同互斥對(duì)象的句柄,通過使用這個(gè)對(duì)象,可使多進(jìn)程同步。以下為共享對(duì)象機(jī)制:如果CreateMutex中的lpMutexAttributes參數(shù)允許繼承,由CreateProcess函數(shù)創(chuàng)建的子進(jìn)程可以繼承父近程的互斥對(duì)象句柄。一個(gè)進(jìn)程可以在調(diào)用DuplicateHandle函數(shù)時(shí)指定互斥對(duì)象句柄來創(chuàng)建一個(gè)可以被其他進(jìn)程使用的雙重句柄。一個(gè)進(jìn)程在調(diào)用OpenMutex或CreateMutex函數(shù)時(shí)能指定互斥對(duì)象名。使用CloseHandle函數(shù)關(guān)閉句柄,進(jìn)程結(jié)束時(shí)系統(tǒng)自動(dòng)關(guān)閉句柄。當(dāng)最后一個(gè)句柄被關(guān)閉時(shí),互

23、斥對(duì)象被銷毀。4.ReleaseMutex函數(shù)(hnsh)功能:該函數(shù)放棄指定(zhdng)互斥對(duì)象的所有權(quán)。函數(shù)(hnsh)原型:BOOL ReleaseMutex (HANDLE hMutex);參數(shù):hMutex:互斥對(duì)象句柄。為CreateMutex或OpenMutex函數(shù)的返回值。返回值:如果函數(shù)調(diào)用成功,那么返回值是非零值;如果函數(shù)調(diào)用失敗,那么返回值是零值。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。備注:如果調(diào)用線程不擁有互斥對(duì)象,ReleaseMutex函數(shù)失敗。一個(gè)線程通過調(diào)用等待函數(shù)擁有互斥對(duì)象。創(chuàng)建該互斥對(duì)象的線程也擁有互斥對(duì)象。而不需要調(diào)用等待函數(shù)。當(dāng)互

24、斥對(duì)象的所有者線程不再需要互斥對(duì)象時(shí),它可以調(diào)用ReleaseMutex函數(shù)。當(dāng)個(gè)線程擁有個(gè)互斥對(duì)象后,它可以用該互斥對(duì)象多次調(diào)用等待函數(shù)而不會(huì)阻塞。這防止一個(gè)線程等待一個(gè)它已擁有的互斥對(duì)象時(shí)出現(xiàn)死鎖。不過,為了釋放所有權(quán),該線程必須為每一個(gè)等待操作調(diào)用一次ReleaseMutex函數(shù);5.WaitForSingleObject函數(shù)功能:當(dāng)下列情況之一發(fā)生時(shí)該函數(shù)返回:(1)指定對(duì)象處于信號(hào)態(tài);(2)超時(shí)。函數(shù)原型:DWORD WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);參數(shù):hHandle:等待對(duì)象句柄。若想了解指定句

25、柄的對(duì)象類型列表,參閱下面?zhèn)渥⒉糠?。在WindowsNT中,句柄必須有SYNCHRONIZE訪問權(quán)限。若想獲得更多的信息,請(qǐng)查看Standard Access Rights。dwMilliseconds:指定以毫秒為單位的超時(shí)間隔。如果超時(shí),即使對(duì)象的狀態(tài)是非信號(hào)態(tài)的并且沒有完成,函數(shù)也返回。如果dwMillseconds是0,函數(shù)測(cè)試對(duì)象的狀態(tài)并立刻返回;如果dwMillseconds是INFINITE,函數(shù)從不超時(shí)。返回值:如果函數(shù)調(diào)用成功,返回值表明引起函數(shù)返回的事件。可能值如下:WAIT_ABANDONED:指定對(duì)象是互斥對(duì)象,在線程被終止前,線程沒有釋放互斥對(duì)象。互斥對(duì)象的所屬關(guān)系被

26、授予調(diào)用線程,并且該互斥對(duì)象被置為非信號(hào)態(tài)。WAIT_OBJECT_0:指定對(duì)象的狀態(tài)被置為信號(hào)態(tài)。WAIT_TIMEOUT:超時(shí),并且對(duì)象的狀態(tài)為非信號(hào)態(tài)。如果函數(shù)調(diào)用失敗,返回值是WAIT_FAILED。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。備注:WaitForSingleObjects函數(shù)決定等待條件(tiojin)是否被滿足。如果等待條件并沒有被滿足,調(diào)用線程進(jìn)入個(gè)高效(o xio)的等待狀態(tài),當(dāng)?shù)却凉M足條件時(shí)占用非常少的處理器時(shí)間。在運(yùn)行前。一個(gè)等待函數(shù)修改同步對(duì)象類型的狀態(tài)。修改僅發(fā)生在引起函數(shù)返回的對(duì)象身上(shn shng)。例如,信號(hào)得計(jì)數(shù)減1。WaitF

27、orSingleObjects函數(shù)能等待的對(duì)象包括:Change notification(改變通告):Console input(控制臺(tái)輸入);Event(事件);Job(作業(yè));Mutex(互斥對(duì)象);Process(進(jìn)程);Semaphore(信號(hào)量);Thread(線程);Waitable timer (可等待定時(shí)器)。當(dāng)使用等待函數(shù)或代碼直接或間接創(chuàng)建窗口時(shí),一定要小心。如果一個(gè)線程創(chuàng)建了任何窗口,它必須處理進(jìn)程消息。消息廣播被發(fā)送到系統(tǒng)的所有窗口。一個(gè)線程用沒有超時(shí)的等待函數(shù)也許會(huì)引起系統(tǒng)死鎖。間接創(chuàng)建窗口的兩個(gè)例子是DDE和COM CoInitialize。因此,如果用戶有一個(gè)創(chuàng)

28、建窗口的線程,用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectEx函數(shù),而不要用SignalObjectAndWait函數(shù)。6.WaitForMultipleObjects函數(shù)功能:WaitForMultipleObjects函數(shù)當(dāng)下列條件之一滿足時(shí)返回:(1)任意一個(gè)或全部指定對(duì)象處于信號(hào)態(tài);(2)超時(shí)間隔已過。函數(shù)原型:DWORD WaitForMultipleObjects (DWORD nCount, CONST HANDLE *lpHandles,BOOL fWaitAll, DWORD dwMilliseconds);參數(shù):nC

29、ount:指定由lpHandles所指向的數(shù)組中的句柄對(duì)象數(shù)目最大對(duì)象句柄數(shù)目MAXIMUM_WAIT_OBJECTS。lpHandles:指向?qū)ο缶浔鷶?shù)組的指針。該數(shù)組可以包含不同類型對(duì)象的句柄。在WindowsNT中,該句柄必須有SYNCHRONIZE訪問權(quán)限。若想獲得更多的信息,請(qǐng)查看Standard Access Rights。fWaitAll:指定等待類型。如果為TRUE,當(dāng)lpHandles指向的數(shù)組里的全部對(duì)象為信號(hào)態(tài)時(shí),函數(shù)返回。如果為FALSE,當(dāng)由lpHandles指向的數(shù)組里的任對(duì)象為信號(hào)態(tài)時(shí),函數(shù)返回。對(duì)于后者,返回值指出引起函數(shù)返回的對(duì)象。dwMilliseconds

30、:指定以毫秒為單位的超時(shí)間隔。如果超時(shí),即使bWaitAll參數(shù)指定的條件沒有滿足,函數(shù)也返回。如果dwMilliseconds是0,函數(shù)測(cè)試指定對(duì)象的狀態(tài)并立刻返回。如果dwMilliseconds是INFINITE,函數(shù)從不超時(shí)。返回值;如果函數(shù)調(diào)用成功,返回值表明引起函數(shù)返回的事件。可能值如下:WAIT_OBJECT_0到WAIT_OB JECT0+ nCount-1:如果bWaitAll為TRUE,那么返回值表明所有指定對(duì)象的狀態(tài)為信號(hào)態(tài)。如果bWaitAll為FALSE,那么返回值減去WAIT_OBJECT_0表明引起函數(shù)返回的對(duì)象的pHandles數(shù)組索引。如果多于一個(gè)對(duì)象變?yōu)樾盘?hào)

31、態(tài),則返回的是數(shù)組索引最小的信號(hào)態(tài)對(duì)象索引。WAIT_ABANDONED_0到WAIT_ABANDONED_0+nCount-1:如果bWaitAll為TRUE,那么(n me)返回值表明所有指定對(duì)象的狀態(tài)為信號(hào)態(tài),并且至少一個(gè)對(duì)象是己放棄的互斥對(duì)象。如果bWaitAll為FALSE,那么返回值減去WAIT_ABANDONED_0表明引起函數(shù)返回的放棄互斥對(duì)象的pHandles數(shù)組索引。WAIT_TIMEOUT:超時(shí)并且由參數(shù)(cnsh)bWaitAll指定的條件沒有滿足。如果函數(shù)調(diào)用(dioyng)失敗,返回值是WAIT_FAILED。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)

32、。7.InitializeCriticalSection函數(shù)功能:該函數(shù)初始化臨界區(qū)對(duì)象:函數(shù)原型:VOID InitializeCriticalSection (LPCRITIAL_SECTION lpCriticalSection);參數(shù):lpCritialSection:指向臨界區(qū)對(duì)象的指針。備注:單進(jìn)程的所有線程可以使用互斥同步機(jī)制的臨界區(qū)對(duì)象。但是,不能保證線程獲得臨界區(qū)所有權(quán)的順序,系統(tǒng)將對(duì)所有線程公平處理。進(jìn)程負(fù)責(zé)分配臨界區(qū)對(duì)象使用的存儲(chǔ)空間,這可以通過聲明CRITICAL_SECTION類型的變量來完成。在使用臨界區(qū)之前,該進(jìn)程的一些線程必須使用InitializeCritic

33、alSection或InitializeCriticalSectionAndSpinCount函數(shù)來初始化該臨界區(qū)對(duì)象。8.EnterCriticalSection函數(shù)功能:該函數(shù)是等待指定臨界區(qū)對(duì)象的所有權(quán)。當(dāng)調(diào)用線程被賦予所有權(quán)時(shí),該函數(shù)返回。函數(shù)原型:VOID EnterCriticalSection (LPCRITICAL_SECTION lpCriticalSecrion);參數(shù):lpCriticalSecrion:指間臨界區(qū)對(duì)象的指針。9.LeaveCriticalSection函數(shù)功能:該函數(shù)釋放指定臨界區(qū)對(duì)象的所有權(quán)。函數(shù)原型:VOID LeaveCriticalSection

34、 (LPCRITICAL_SECTION lpCriticalSection);參數(shù);lpCriticalSecrion:指向臨界區(qū)對(duì)象的指針。五、設(shè)計(jì)(shj)流程圖: 圖1:讀者(dzh)優(yōu)先流程圖圖2:寫者優(yōu)先流程圖六、核心(hxn)源程序代碼和界面圖:1、源程序代碼#include windows.h#include #include #include #include #include #include #define READER R /讀者#define WRITER W /寫者#define INTE_PER_SEC 500 /每秒時(shí)鐘中斷的數(shù)目#define MAX_THRE

35、AD_NUM 64 /最大線程數(shù)#define MAX_FILE_NUM 32 /最大文件數(shù)目數(shù)#define MAX_STR_LEN 32 /字符串的長度int readcount=0; /讀者數(shù)目int writecount=0; /寫者數(shù)目(shm)CRITICAL_SECTION RP_Write; /臨界(ln ji)資源CRITICAL_SECTION cs_Write;CRITICAL_SECTION cs_Read;struct ThreadInfo int serial; /線程序(chngx)號(hào) char entity; /線程類別(判斷是讀者還是寫者線程) double

36、delay; /線程延遲時(shí)間 double persist; /線程讀寫操作時(shí)間;/ 讀者優(yōu)先讀者線程/P:讀者線程信息void RP_ReaderThread(void *p) /互斥變量 HANDLE h_Mutex; h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,mutex_for_readcount); DWORD wait_for_mutex; /等待互斥變量所有權(quán) DWORD m_delay; /延遲時(shí)間 DWORD m_persist; /讀文件持續(xù)時(shí)間 int m_serial; /線程序號(hào) / 從參數(shù)中獲得信息 m_serial=(Thre

37、adInfo*)(p)-serial ; m_delay=(DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC); m_persist=(DWORD)(ThreadInfo*)(p)-persist *INTE_PER_SEC); Sleep(m_delay); /延遲等待 printf(Reader thread %d sents the reading require.n,m_serial); /等待互斥信號(hào),保證對(duì)ReadCount 的訪問,修改互斥 wait_for_mutex=WaitForSingleObject(h_Mutex,-1); /讀者數(shù)

38、目增加 readcount+; if(readcount=1) /第一個(gè)讀者,等待資源 EnterCriticalSection(&RP_Write); ReleaseMutex(h_Mutex); /釋放互斥信號(hào) /讀文件 printf(Reader thread %d begins to read file.n,m_serial); Sleep(m_persist); /退出線程 printf(Reader thread %d finished reading file.n,m_serial); /等待互斥信號(hào),保證對(duì)ReadCount的訪問(fngwn),修改互斥 wait_for_mu

39、tex=WaitForSingleObject(h_Mutex,-1); /讀者數(shù)目(shm)減少 readcount-; if(readcount=0) /如果(rgu)所有的讀者讀完,喚醒寫者 LeaveCriticalSection(&RP_Write); ReleaseMutex(h_Mutex); /釋放互斥信號(hào)/P:寫者線程信息void RP_WriterThread(void *p) DWORD m_delay; /延遲時(shí)間 DWORD m_persist; /寫文件持續(xù)時(shí)間 int m_serial; /線程序號(hào) / 從參數(shù)中獲得信息 m_serial=(ThreadInfo*

40、)(p)-serial ; m_delay=(DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC); m_persist=(DWORD)(ThreadInfo*)(p)-persist *INTE_PER_SEC); Sleep(m_delay); printf(Writer thread %d sents the writing require.n,m_serial); /等待資源 EnterCriticalSection(&RP_Write);/實(shí)現(xiàn)寫-寫互斥 /寫文件 printf(Writer thread %d begins to write to

41、the file.n,m_serial); Sleep(m_persist); /退出線程 printf(Writer thread %d finished writing to the file.n,m_serial); /釋放資源 LeaveCriticalSection(&RP_Write);/讀者優(yōu)先處理函數(shù)/file:文件名void ReaderPriority(char *file) DWORD n_thread=0; /線程數(shù)目 DWORD thread_ID; /線程ID DWORD wait_for_all; /等待所有線程結(jié)束 /線程對(duì)象的數(shù)組 HANDLE h_Threa

42、dMAX_THREAD_NUM; ThreadInfo thread_infoMAX_THREAD_NUM; readcount=0; /初始化readcount InitializeCriticalSection(&RP_Write); /初始化臨界(ln ji)區(qū) ifstream inFile; inFile.open (file); printf(Reader Priority:nn); while(inFile) /讀入每一個(gè)讀者(dzh),寫者的信息 inFilethread_infon_thread.serial; inFilethread_infon_thread.entity

43、; inFilethread_infon_thread.delay; inFilethread_infon_thread+.persist; inFile.get(); for(int i=0;iserial ; m_delay=(DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC); m_persist=(DWORD)(ThreadInfo*)(p)-persist *INTE_PER_SEC); Sleep(m_delay); /延遲等待 printf(Reader thread %d sents the reading require.n,m_seria

44、l); wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1); /讀者進(jìn)去臨界區(qū) EnterCriticalSection(&cs_Read);/讀者先來,一旦有寫者,則后續(xù)讀者必須等待,喚醒時(shí)優(yōu)先考慮寫者 /阻塞互斥對(duì)象Mutex2,保證對(duì)readCount的訪問和修改互斥 wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1); /修改讀者的數(shù)目 readcount+; if(readcount=1) / 如果是第1個(gè)寫,等待讀者寫完 EnterCriticalSection(&cs_Write); Re

45、leaseMutex(h_Mutex2);/ 釋放互斥信號(hào) Mutex2 /讓其他讀者進(jìn)去臨界區(qū) LeaveCriticalSection(&cs_Read); ReleaseMutex(h_Mutex1); /讀文件 printf(Reader thread %d begins to read file.n,m_serial); Sleep(m_persist); /退出線程 printf(Reader thread %d finished reading file.n,m_serial); /阻塞互斥對(duì)象Mutex2,保證對(duì)readcount的訪問,修改互斥 wait_for_mutex2

46、=WaitForSingleObject(h_Mutex2,-1); readcount-; if(readcount=0) /最后一個(gè)讀者(dzh),喚醒寫者 LeaveCriticalSection(&cs_Write); ReleaseMutex(h_Mutex2); /釋放(shfng)互斥信號(hào)/寫者優(yōu)先(yuxin)寫者線程/P:寫者線程信息void WP_WriterThread(void *p) DWORD wait_for_mutex2; /互斥變量 DWORD m_delay; /延遲時(shí)間 DWORD m_persist; /讀文件持續(xù)時(shí)間 int m_serial; /線程

47、序號(hào) HANDLE h_Mutex2;/互斥對(duì)象h_Mutex2來實(shí)現(xiàn)對(duì)全局變量writecount修改時(shí)的互斥 h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,mutex2); /從參數(shù)中獲得信息 m_serial=(ThreadInfo*)(p)-serial ; m_delay=(DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC); m_persist=(DWORD)(ThreadInfo*)(p)-persist *INTE_PER_SEC); Sleep(m_delay); /延遲等待 printf(Writer

48、 thread %d sents the writing require.n,m_serial); wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1); writecount+; /修改寫者數(shù)目 if(writecount=1) EnterCriticalSection(&cs_Read);/控制讀寫互斥,讀者等待寫者釋放資源 ReleaseMutex(h_Mutex2); EnterCriticalSection(&cs_Write);/有寫者在寫,寫者等待 printf(Writer thread %d begins to write to t

49、he file.n,m_serial); Sleep(m_persist); printf(Writer thread %d finished writing to the file.n,m_serial); LeaveCriticalSection(&cs_Write); wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1); writecount-; if(writecount=0) LeaveCriticalSection(&cs_Read); ReleaseMutex(h_Mutex2);/寫者優(yōu)先(yuxin)處理函數(shù)/ file:文件名v

50、oid WriterPriority(char * file) DWORD n_thread=0; DWORD thread_ID; DWORD wait_for_all; HANDLE h_ThreadMAX_THREAD_NUM; ThreadInfo thread_infoMAX_THREAD_NUM; readcount=0; writecount=0; InitializeCriticalSection(&cs_Write);/寫寫互斥的臨界(ln ji)區(qū) InitializeCriticalSection(&cs_Read);/讀寫互斥的臨界(ln ji)區(qū) ifstream i

51、nFile; inFile.open (file); printf(Writer priority:nn); while(inFile) inFilethread_infon_thread.serial; inFilethread_infon_thread.entity; inFilethread_infon_thread.delay; inFilethread_infon_thread+.persist; inFile.get(); for(int i=0;i(int)(n_thread);i+) if(thread_infoi.entity=READER|thread_infoi.enti

52、ty =r) /創(chuàng)建讀者進(jìn)程 h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_ReaderThread),&thread_infoi,0,&thread_ID); else /創(chuàng)建寫線程 h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_WriterThread),&thread_infoi,0,&thread_ID); /等待所有的線程結(jié)束 wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-

53、1); printf(All reader and writer have finished operating.n);/主函數(shù)(hnsh)int main(int argc,char *argv) char ch; while(true) printf(*n); printf( 1.Reader Priorityn); printf( 2.Writer Priorityn); printf( 3.Exit to Windowsn); printf(*n); printf(Enter your choice(1,2,3): ); do ch=(char)_getch(); while(ch!=

54、1&ch!=2&ch!=3); system(cls); if(ch=3) return 0; else if(ch=1) ReaderPriority(thread.dat); else WriterPriority(thread.dat); printf(nPress Any Key to Coutinue:); _getch(); system(cls); return 0;2、主菜單(ci dn)界面:對(duì)數(shù)據(jù)文件thread.dat進(jìn)行(jnxng)分析:1 W 3 52 W 4 53 R 5 24 R 6 55 W 5.1 33、讀者(dzh)優(yōu)先界面:分析(fnx)如下:Write

55、r thread 1 sents the writing require.Writer thread 1 begins to write to the file.當(dāng)寫者1發(fā)出請(qǐng)求時(shí),沒有(mi yu)讀者,寫者1寫文件。Writer thread 2 sents the writing require.當(dāng)寫者2發(fā)出請(qǐng)求時(shí),有寫者在寫,寫者2阻塞。Reader thread 3 sents the reading require.當(dāng)讀者3發(fā)出請(qǐng)求時(shí),有寫者在寫,讀者3阻塞。Writer thread 5 sents the writing require.Reader thread 4 sents the reading require.Reader thread 4 begins to read file.應(yīng)寫者1完成寫文

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論