讀者寫者實驗報告參考模板_第1頁
讀者寫者實驗報告參考模板_第2頁
讀者寫者實驗報告參考模板_第3頁
讀者寫者實驗報告參考模板_第4頁
讀者寫者實驗報告參考模板_第5頁
已閱讀5頁,還剩18頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、操作系統原理 實驗報告實驗名稱: 操作系統 姓 名: XXX 學 號: xxxxxxxxxx 班 級: xxx 指導老師: xxx 1 / 23一、實驗內容在Windows2000環境下,創建一個控制臺進程,此進程包含n個線程。用這n個線程來表示n個讀者或寫者。每個線程按相應測試數據文件(后面有介紹)的要求進行讀寫操作。用信號量機制分別實現讀者優先和寫者優先的讀者-寫者問題。讀者-寫者問題的讀寫操作限制(包括讀者優先和寫者優先):1)寫-寫互斥,即不能有兩個寫者同時進行寫操作。2)讀-寫互斥,即不能同時有一個線程在讀,而另一個線程在寫。,3)讀-讀允許,即可以有一個或多個讀者在讀。讀者優先的附

2、加限制:如果一個讀者申請進行讀操作時已有另一個讀者正在進行讀操作,則該讀者可直接開始讀操作。寫者優先的附加限制:如果一個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到沒有寫者處于等待狀態后才能開始讀操作。運行結果顯示要求:要求在每個線程創建、發出讀寫操作申請、開始讀寫操作和結束讀寫操作時分別顯示一行提示信息,以確定所有處理都遵守相應的讀寫操作限制。二、實驗目的在Windows2000環境下,創建一個控制臺進程,此進程包含n個線程。用這n個線程來表示n個讀者或寫者。每個線程按相應測試數據文件(后面有介紹)的要求進行讀寫操作。用信號量機制分別實現讀者優先和寫者優先的讀者-寫者

3、問題。三、實驗原理1).讀者優先讀者優先指的是除非有寫者在寫文件,否則讀者不需要等待。所以可以用一個整型變量read_count記錄當前的讀者數目,用于確定是否需要釋放正在等待的寫者線程(當read_count=O時,表明所有的讀者讀完,需要釋放寫者等待隊列中的一個寫者)。每一個讀者開始讀文件時,必須修改read_count變量。因此需要一個互斥對象mutex來實現對全局變量read_count修改時的互斥。另外,為了實現寫-寫互斥,需要增加一個臨界區對象write。當寫者發出寫請求時,必須申請臨界區對象的所有權。通過這種方法,也可以實現讀-寫互斥,當read_count=l時(即第一個讀者到

4、來時),讀者線程也必須申請臨界區對象的所有權。當讀者擁有臨界區的所有權時,寫者阻塞在臨界區對象write上。當寫者擁有臨界區的所有權時, 第一個讀者判斷完 "read_count=1"后阻塞在write上,其余的讀者由于等待對read_count的判斷,阻塞在mutex上。2).寫者優先寫者優先與讀者優先類似;不同之處在于一旦一個寫者到來,它應該盡快對文件進行寫操作,如果有一個寫者在等待,則新到來的讀者不允許進行讀操作。為此應當添加一個整型變量write_count,用于記錄正在等待的寫者的數目,當write_count=O時,才可以釋放等待的讀者線程隊列。為了對全局變量w

5、rite_count實現互斥,必須增加一個互斥對象mutex3。為了實現寫者優先,應當添加一個臨界區對象read,當有寫者在寫文件或等待時,讀者必須阻塞在read上。 ·讀者線程除了要對全局變量read_count實現操作上的互斥外,還必須有一個互斥對象對阻塞,read這一過程實現互斥。這兩個互斥對象分別命名為mutex1和mutex2。四、實驗過程在Windows2000環境下,創建一個控制臺進程。用VC+實現。讀者優先指的是除非有寫者在寫文件,否則讀者不需要等待。所以可以用一個整型變量read_count記錄當前的讀者數目,用于確定是否需要釋放正在等待的寫者線程(當read_co

6、unt=O時,表明所有的讀者讀完,需要釋放寫者等待隊列中的一個寫者)。每一個讀者開始讀文件時,必須修改read_count變量。因此需要一個互斥對象mutex來實現對全局變量read_count修改時的互斥。另外,為了實現寫-寫互斥,需要增加一個臨界區對象write。當寫者發出寫請求時,必須申請臨界區對象的所有權。通過這種方法,也可以實現讀-寫互斥,當read_count=l時(即第一個讀者到來時),讀者線程也必須申請臨界區對象的所有權。當讀者擁有臨界區的所有權時,寫者阻塞在臨界區對象write上。當寫者擁有臨界區的所有權時, 第一個讀者判斷完 "read_count=1"

7、后阻塞在write上,其余的讀者由于等待對read_count的判斷,阻塞在mutex上。寫者優先與讀者優先類似;不同之處在于一旦一個寫者到來,它應該盡快對文件進行寫操作,如果有一個寫者在等待,則新到來的讀者不允許進行讀操作。為此應當添加一個整型變量write_count,用于記錄正在等待的寫者的數目,當write_count=O時,才可以釋放等待的讀者線程隊列。為了對全局變量write_count實現互斥,必須增加一個互斥對象mutex3。為了實現寫者優先,應當添加一個臨界區對象read,當有寫者在寫文件或等待時,讀者必須阻塞在read上。 ·讀者線程除了要對全局變量read_co

8、unt實現操作上的互斥外,還必須有一個互斥對象對阻塞,read這一過程實現互斥。這兩個互斥對象分別命名為mutex1和mutex2。結構:頭文件定義全局變量RP_ReaderThread()讀者優先-讀者線程RP_WriterThread()讀者優先-寫者線程ReaderPriority ()讀者優先處理函數WP_ReaderThrea ()寫者優先-讀者線程WP_WriterThread()寫者優先-寫者線程WriterPriority ()寫者優先處理函數主函數:包含對dat文件的讀取以及函數的調用。代碼:附錄五、實驗結果 界面:測試數據:2 W 4 53 R 5 24 R 6 55 W

9、5.1 3結果讀者優先寫者優先六、實驗心得體會通過對讀者寫者問題的編程,對線程有了更深的了解,希望在后面的學習中懂得更多。七、參考文獻 老師提供的資料,以及互聯網查閱。八、附錄 #include "windows.h"#include <conio.h>#include <stdlib.h>#include <fstream.h>#include <io.h>#include <string.h>#include <stdio.h>#include "winbase.h"#defin

10、e READER 'R' / 讀者#define WRITER 'W' / 寫者#define INTE_PER_SEC 1000 / 每秒時鐘中斷的數目#define MAX_THREAD_NUM 64 / 最大線程數int nReaderCnt = 0; / 讀者計數int nWriterCnt = 0; / 寫者計數HANDLE hWrite = :CreateSemaphore( NULL, 1, 1, NULL ); / 寫開始信號HANDLE hRead = :CreateSemaphore( NULL, 1, 1, NULL ); / 讀開始信號H

11、ANDLE hRCMutex = :CreateMutex( NULL, FALSE, NULL ); HANDLE hWCMutex = :CreateMutex( NULL, FALSE, NULL );HANDLE hReadMutex = :CreateMutex( NULL, FALSE, NULL );/ 從測試數據文件中獲取的線程信息struct ThreadInfo ThreadInfo() nSerialNo = 0; cType = '' dDelayTime = 0.0; dOpeTime = 0.0; int nSerialNo; / 線程序號 char

12、 cType; / 線程類別 double dDelayTime; / 線程延遲時間 double dOpeTime; / 線程讀寫操作時間;/ 讀者優先-讀者線程/ P:讀者線程信息void RP_ReaderThread(void *p) int nSerialNo = (ThreadInfo*)(p)->nSerialNo ; /從文件中讀取 線程序號 DWORD dwReadTime = (DWORD)(ThreadInfo*)(p)->dOpeTime * INTE_PER_SEC ); DWORD dwDelay = (DWORD)(ThreadInfo*)(p)-&g

13、t;dDelayTime * INTE_PER_SEC ); Sleep( dwDelay ); printf("Reader thread %d sents the reading require.n",nSerialNo); WaitForSingleObject( hRCMutex, INFINITE ); nReaderCnt+; if( nReaderCnt = 1 ) WaitForSingleObject( hWrite, INFINITE ); ReleaseMutex(hRCMutex); printf( "Reader thread %d be

14、gins to read file.n", nSerialNo ); Sleep( dwReadTime ); printf( "Reader thread %d finished reading file.n", nSerialNo ); WaitForSingleObject( hRCMutex, INFINITE ); nReaderCnt-; if( nReaderCnt = 0 ) ReleaseSemaphore( hWrite, 1, NULL ); ReleaseMutex(hRCMutex);/ 讀者優先-寫者線程/ P:寫者線程信息void R

15、P_WriterThread(void *p) int nSerialNo = (ThreadInfo*)(p)->nSerialNo ; / 從參數中獲得信息 DWORD dwWriteTime = (DWORD)(ThreadInfo*)(p)->dOpeTime * INTE_PER_SEC ); DWORD dwDelay = (DWORD)(ThreadInfo*)(p)->dDelayTime * INTE_PER_SEC ); Sleep( dwDelay ); printf("Write thread %d sents the writing req

16、uire.n",nSerialNo); WaitForSingleObject( hWrite, INFINITE ); printf( "Writer thread %d begins to write to the file.n", nSerialNo ); Sleep( dwWriteTime ); printf( "Write thread %d finished writing to the file.n", nSerialNo ); ReleaseSemaphore( hWrite, 1, NULL );/ 讀者優先處理函數/ fi

17、le:文件名void ReaderPriority( char *file ) int nThreadCnt = 0; DWORD dwThreadID = 0; nReaderCnt = 0; / 初始化讀寫者計數 HANDLE hThreadsMAX_THREAD_NUM; ThreadInfo oThreadInfoMAX_THREAD_NUM; ifstream inFile; inFile.open ( file ); printf( "Reader Priority:nn" ); while( inFile ) / 讀入每一個讀者,寫者的信息 inFile>

18、;>oThreadInfonThreadCnt.nSerialNo; inFile>>oThreadInfonThreadCnt.cType; inFile>>oThreadInfonThreadCnt.dDelayTime; inFile>>oThreadInfonThreadCnt.dOpeTime; if ( '' != oThreadInfonThreadCnt.cType ) nThreadCnt+; inFile.get(); / 創建線程 for( int i = 0; i< nThreadCnt; i+ ) if(

19、 oThreadInfoi.cType=READER ) | ( oThreadInfoi.cType = 'r' ) hThreadsi = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(RP_ReaderThread), / 創建讀者進程 &oThreadInfoi, CREATE_SUSPENDED, &dwThreadID ); else hThreadsi = CreateThread( NULL, 0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),/ 創建寫線程

20、&oThreadInfoi, CREATE_SUSPENDED, &dwThreadID ); for( i = 0; i< nThreadCnt; i+ ) ResumeThread( hThreadsi ); WaitForMultipleObjects( nThreadCnt, hThreads, TRUE, INFINITE ); printf( "All reader and writer have finished operating.n" ); / 寫者優先-讀者線程/ P:讀者線程信息void WP_ReaderThread( void

21、 *p ) int nSerialNo = (ThreadInfo*)(p)->nSerialNo ; / 從參數中得到信息 DWORD dwReadTime = (DWORD)(ThreadInfo*)(p)->dOpeTime * INTE_PER_SEC ); DWORD dwDelay = (DWORD)(ThreadInfo*)(p)->dDelayTime * INTE_PER_SEC ); Sleep( dwDelay ); printf("Reader thread %d sents the reading require.n",nSeri

22、alNo); WaitForSingleObject( hReadMutex, INFINITE ); WaitForSingleObject( hRead, INFINITE ); WaitForSingleObject( hRCMutex, INFINITE ); nReaderCnt+; if(nReaderCnt=1) WaitForSingleObject( hWrite, INFINITE ); ReleaseMutex( hRCMutex ); ReleaseSemaphore( hRead, 1, NULL ); ReleaseMutex( hReadMutex ); prin

23、tf( "Reader thread %d begins to read file.n", nSerialNo ); Sleep( dwReadTime ); printf( "Reader thread %d finished reading file.n", nSerialNo ); WaitForSingleObject( hRCMutex, INFINITE ); nReaderCnt-; if( nReaderCnt = 0 ) ReleaseSemaphore( hWrite, 1, NULL ); ReleaseMutex( hRCMute

24、x );/ 寫者優先-寫者線程/ P:寫者線程信息void WP_WriterThread( void *p ) int nSerialNo = (ThreadInfo*)(p)->nSerialNo; DWORD dwWriteTime = (DWORD)(ThreadInfo*)(p)->dOpeTime * INTE_PER_SEC ); DWORD dwDelay = (DWORD)(ThreadInfo*)(p)->dDelayTime * INTE_PER_SEC ); Sleep( dwDelay ); printf("Writer thread %d

25、 sents the writing require.n",nSerialNo); WaitForSingleObject( hWCMutex, INFINITE ); nWriterCnt+; if( nWriterCnt = 1 ) WaitForSingleObject( hRead, INFINITE ); ReleaseMutex(hWCMutex); WaitForSingleObject( hWrite, INFINITE ); printf( "Writer thread %d begins to write to the file.n", nSe

26、rialNo ); Sleep( dwWriteTime ); printf( "Writer thread %d finished writing to the file.n", nSerialNo ); ReleaseSemaphore( hWrite, 1, NULL ); WaitForSingleObject( hWCMutex, INFINITE ); nWriterCnt-; if( nWriterCnt = 0 ) ReleaseSemaphore( hRead, 1, NULL ); ReleaseMutex(hWCMutex);/ 寫者優先處理函數/ f

27、ile:文件名void WriterPriority( char * file ) int nThreadCnt = 0; DWORD dwThreadID; HANDLE hThreadsMAX_THREAD_NUM; ThreadInfo oThreadInfoMAX_THREAD_NUM; nReaderCnt=0; nWriterCnt=0; ifstream inFile; inFile.open (file); printf("Writer priority:nn"); while(inFile) inFile>>oThreadInfonThread

28、Cnt.nSerialNo; inFile>>oThreadInfonThreadCnt.cType; inFile>>oThreadInfonThreadCnt.dDelayTime; inFile>>oThreadInfonThreadCnt.dOpeTime; if ( '' != oThreadInfonThreadCnt.cType ) nThreadCnt+; inFile.get(); for( int i = 0 ;i < nThreadCnt; i+ ) / 創建線程 if( oThreadInfoi.cType = READER ) | ( oThreadInfoi.cType = 'r' ) hThreadsi = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(WP_ReaderThread), /創建讀者進程 &oThreadInfoi, CREATE_SUSPENDED, &dwThreadID

溫馨提示

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

評論

0/150

提交評論