版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、實驗題目:實驗五 讀者-寫者問題完成人:報告日期:1、 實驗內(nèi)容簡要描述1) 創(chuàng)建一個控制臺進程,此進程包含n個線程。用這n個線程來表示n個讀者或?qū)懻摺C總€線程按相應測試數(shù)據(jù)文件的要求進行讀寫操作。用信號量機制分別實現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。2) 讀者-寫者問題的讀寫操作限制(包括讀者優(yōu)先和寫者優(yōu)先):j 寫-寫互斥,即不能有兩個寫者同時進行寫操作。k 讀-寫互斥,即不能同時有一個線程在讀,而另一個線程在寫。l 讀-讀允許,即可以有一個或多個讀者在讀。3) 讀者優(yōu)先的附加限制:如果一個讀者申請進行讀操作時已有另一個讀者正在進行讀操作,則該讀者可直接開始讀操作。4) 寫者優(yōu)先的附加限
2、制:如果一個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。5) 運行結果顯示要求:要求在每個線程創(chuàng)建、發(fā)出讀寫操作申請、開始讀寫操作和結束讀寫操作時分別顯示一行提示信息,以確定所有處理都遵守相應的讀寫操作限制。二、程序設計1、設計思路將所有讀者和所有寫者分別存于一個讀者等待隊列和一個寫者等待隊列中,每當讀允許時,就從讀者隊列中釋放一個或多個讀者線程進行讀操作;每當寫允許時,就從寫者隊列中釋放一個寫者進行寫操作。2、 主要數(shù)據(jù)結構1)讀者優(yōu)先讀者優(yōu)先指的是除非有寫者在寫文件,否則讀者不需要等待。所以可以用一個整型變量read_count
3、記錄當前的讀者數(shù)目,用于確定是否需要釋放正在等待的寫者線程(當read_count=0時,表明所有的讀者讀完,需要釋放寫者等待隊列中的一個寫者)。每一個讀者開始讀文件時,必須修改read_count變量。因此需要一個互斥對象mutex來實現(xiàn)對全局變量read_count修改時的互斥。另外,為了實現(xiàn)寫-寫互斥,需要增加一個臨界區(qū)對象write。當寫者發(fā)出寫請求時,必須申請臨界區(qū)對象的所有權。通過這種方法,也可以實現(xiàn)讀-寫互斥,當read_count=l時(即第一個讀者到來時),讀者線程也必須申請臨界區(qū)對象的所有權。當讀者擁有臨界區(qū)的所有權時,寫者阻塞在臨界區(qū)對象write上。當寫者擁有臨界區(qū)的所
4、有權時, 第一個讀者判斷完 "read_count=1"后阻塞在write上,其余的讀者由于等待對read_count的判斷,阻塞在mutex上。2)寫者優(yōu)先寫者優(yōu)先與讀者優(yōu)先類似;不同之處在于一旦一個寫者到來,它應該盡快對文件進行寫操作,如果有一個寫者在等待,則新到來的讀者不允許進行讀操作。為此應當添加一個整型變量write_count,用于記錄正在等待的寫者的數(shù)目,當write_count=0時,才可以釋放等待的讀者線程隊列。為了對全局變量write_count實現(xiàn)互斥,必須增加一個互斥對象mutex3。為了實現(xiàn)寫者優(yōu)先,應當添加一個臨界區(qū)對象read,當有寫者在寫文件
5、或等待時,讀者必須阻塞在read上。 ·讀者線程除了要對全局變量read_count實現(xiàn)操作上的互斥外,還必須有一個互斥對象對阻塞,read這一過程實現(xiàn)互斥。這兩個互斥對象分別命名為mutex1和mutex2。 三、實驗結果1、基本數(shù)據(jù)源程序代碼行數(shù)完成該實驗投入的時間(小時數(shù))與其他同學討論次數(shù)355532、 測試數(shù)據(jù)設計測試數(shù)據(jù)文件包括n行測試數(shù)據(jù),分別描述創(chuàng)建的n個線程是讀者還是寫者,以及讀寫操作的開始時間和持續(xù)時間。每行測試數(shù)據(jù)包括四個字段,各個字段間用空格分隔。第一字段為一個正整數(shù),表示線程序號。第二字段表示相應線程角色,R表示讀者,W表示寫者。第三字段為一個正數(shù),表示讀寫
6、操作的開始時間:線程創(chuàng)建后,延遲相應時間(單位為秒)后發(fā)出對共享資源的讀寫申請。第四字段為一個正數(shù),表示讀寫操作的持續(xù)時間。當線程讀寫申請成功后,開始對共享資源的讀寫操作,該操作持續(xù)相應時間后結束,并釋放共享資源。下面是一個測試數(shù)據(jù)文件的例子:2 W 4 53 R 5 24 R 6 5 5 W 5.1 33、測試結果分析四、實驗體會1、實驗過程中遇到的問題及解決過程2、實驗體會和收獲五、源代碼#include "windows.h"#include <conio.h>#include <stdlib.h>#include <fstream.h&
7、gt;#include <io.h>#include <string.h>#include <stdio.h>#define READER 'R' / 讀者#define WRITER 'W' / 寫者#define INTE_PER_SEC 1000 / 每秒時鐘中斷數(shù)目。#define MAX_THREAD_NUM 64 / 最大線程數(shù)目#define MAX_FILE_NUM 32 / 最大數(shù)據(jù)文件數(shù)目#define MAX_STR_LEN 32 / 字符串長度int readcount=0; / 讀者數(shù)目int wri
8、tecount=0; / 寫者數(shù)目CRITICAL_SECTION RP_Write; /臨界區(qū)CRITICAL_SECTION cs_Write;CRITICAL_SECTION cs_Read;struct ThreadInfoint serial; / 線程序號char entity; /線程類別(判斷讀者線程還是寫者線程)double delay;double persist;/ 讀者優(yōu)先-讀者線程/p:讀者線程信息void RP_ReaderThread(void* p)/互斥變量HANDLE h_Mutex;h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FA
9、LSE,"mutex_for_readcount");DWORD wait_for_mutex; /等待互斥變量所有權DWORD m_delay; / 延遲時間DWORD m_persist; / 讀文件持續(xù)時間int m_serial; /線程序號/從參數(shù)中獲得信息m_serial=(ThreadInfo*)(p)->serial;m_delay=(DWORD)(ThreadInfo*)(p)->delay*INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)->persist*INTE_PER_SEC);Sle
10、ep(m_delay); /延遲等待printf("Reader thread %d sents the reading require.n",m_serial);/ 等待互斥信號,保證對readcount的訪問、修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/讀者數(shù)目增加readcount+;if(readcount=1) /第一個讀者,等待資源 EnterCriticalSection(&RP_Write);ReleaseMutex(h_Mutex); /釋放互斥信號/讀文件printf("Rea
11、der thread %d begins to read file.n",m_serial);Sleep(m_persist);/ 退出線程printf("Reader thread %d finished reading file.n",m_serial);/等待互斥信號,保證對readcount的訪問、修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/讀者數(shù)目減少readcount-;if(readcount=0) /如果所有讀者讀完,喚醒寫者 LeaveCriticalSection(&RP_Wr
12、ite);ReleaseMutex(h_Mutex); /釋放互斥信號/ 讀者優(yōu)先-寫者線程/p:寫者線程信息void RP_WriterThread(void* p)DWORD m_delay; / 延遲時間DWORD m_persist; / 寫文件持續(xù)時間int m_serial; /線程序號/從參數(shù)中獲得信息m_serial=(ThreadInfo*)(p)->serial;m_delay=(DWORD)(ThreadInfo*)(p)->delay*INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p) ->persist*I
13、NTE_PER_SEC);Sleep(m_delay); /延遲等待printf("Writer thread %d sents the writing require.n",m_serial);/ 等待資源EnterCriticalSection(&RP_Write);/寫文件printf("Writer thread %d begins to Write to the file.n",m_serial);Sleep(m_persist);/ 退出線程printf("Writer thread %d finished Writing
14、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; /線程IDDWORD wait_for_all; /等待所有線程結束/互斥對象HANDLE h_Mutex;h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_readcount");/線程對象的數(shù)組HANDLE h_Thre
15、adMAX_THREAD_NUM;ThreadInfo thread_infoMAX_THREAD_NUM;readcount=0; / 初始化 readcountInitializeCriticalSection(&RP_Write); /初始化臨界區(qū)ifstream inFile;inFile.open(file); /打開文件printf("Reader Priority:nn");while(inFile) /讀入每一個讀者、寫者的信息 inFile>>thread_infon_thread.serial; inFile>>threa
16、d_infon_thread.entity; inFile>>thread_infon_thread.delay; inFile>>thread_infon_thread+.persist; inFile.get( );for(int i=0;i< (int)(n_thread);i+) if(thread_infoi.entity=READER | thread_infoi.entity='R') h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),&am
17、p;thread_infoi,0,&thread_ID); /創(chuàng)建讀者線程 else /創(chuàng)建寫者線程h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),&thread_infoi,0,&thread_ID); /等待所有線程結束wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);printf("All reader and writer have finished operating.n"
18、;);/ 寫者優(yōu)先-讀者線程/p:讀者線程信息void WP_ReaderThread(void* p)/互斥變量HANDLE h_Mutex1;h_Mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex1");HANDLE h_Mutex2;h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex2");DWORD wait_for_mutex1; /等待互斥變量所有權DWORD wait_for_mutex2;DWORD m_delay; / 延遲時間DWORD m_per
19、sist; / 讀文件持續(xù)時間int m_serial; /線程序號/從參數(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("Reader thread %d sents the reading require.n",m_serial);wait_for
20、_mutex1= WaitForSingleObject(h_Mutex1,-1);/進入讀者臨界區(qū) EnterCriticalSection(&cs_Read);/ 阻塞互斥對象mutex2,保證對readcount的訪問、修改互斥wait_for_mutex2= WaitForSingleObject(h_Mutex2,-1);/修改讀者數(shù)目readcount+;if(readcount=1) /如果是第一個讀者,等待寫者寫完 EnterCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2); /釋放互斥信號mutex2/ 讓其他
21、讀者進入臨界區(qū)LeaveCriticalSection(&cs_Write);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);/ 阻塞互斥對象mutex2,保證對readcount的訪問、修改互斥wait_for_mutex2= WaitForSingleObje
22、ct(h_Mutex2,-1);readcount-;if(readcount=0) / 最后一個讀者,喚醒寫者 LeaveCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2); /釋放互斥信號/ 寫者優(yōu)先-寫者線程/p:寫者線程信息void WP_WriterThread(void* p)DWORD m_delay; / 延遲時間DWORD m_persist; / 寫文件持續(xù)時間int m_serial; /線程序號DWORD wait_for_mutex3;/互斥對象HANDLE h_Mutex3;h_Mutex3= OpenMute
23、x(MUTEX_ALL_ACCESS,FALSE,"mutex3");/從參數(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 thread %d sents the writing require.n",m_serial
24、);/ 阻塞互斥對象mutex3,保證對writecount的訪問、修改互斥wait_for_mutex3= WaitForSingleObject(h_Mutex3,-1);writecount+; /修改讀者數(shù)目if(writecount=1) /第一個寫者,等待讀者讀完 EnterCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3);/進入寫者臨界區(qū)EnterCriticalSection(&cs_Write);/寫文件printf("Writer thread %d begins to Write to the fi
25、le.n",m_serial);Sleep(m_persist);/ 退出線程printf("Writer thread %d finishing Writing to the file.n",m_serial);/離開臨界區(qū)LeaveCriticalSection(&cs_Write);/ 阻塞互斥對象mutex3,保證對writecount的訪問、修改互斥wait_for_mutex3= WaitForSingleObject(h_Mutex3,-1);writecount-; /修改讀者數(shù)目if(writecount=0) /寫者寫完,讀者可以讀 L
26、eaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3);/ 寫者優(yōu)先處理函數(shù)/file:文件名void WriterPriority(char* file)DWORD n_thread=0; /線程數(shù)目DWORD thread_ID; /線程IDDWORD wait_for_all; /等待所有線程結束/互斥對象HANDLE h_Mutex1;h_Mutex1=CreateMutex(NULL,FALSE,"mutex1");HANDLE h_Mutex2;h_Mutex2=CreateMutex(NULL,FALS
27、E,"mutex2");HANDLE h_Mutex3;h_Mutex3=CreateMutex(NULL,FALSE,"mutex3");/線程對象HANDLE h_ThreadMAX_THREAD_NUM;ThreadInfo thread_infoMAX_THREAD_NUM;readcount=0; / 初始化 readcountwritecount=0; / 初始化writecountInitializeCriticalSection(&cs_Write); /初始化臨界區(qū)InitializeCriticalSection(&c
28、s_Read);ifstream inFile;inFile.open(file); /打開文件printf("Writer Priority:nn");while(inFile) /讀入每一個讀者、寫者的信息 inFile>>thread_infon_thread.serial; inFile>>thread_infon_thread.entity; inFile>>thread_infon_thread.delay; inFile>>thread_infon_thread+.persist; inFile.get( );for(int i=0;i< (int)(n_thread);i+) if (thread_infoi.entity=READER | thread_infoi.entity='R') /創(chuàng)建讀者線程 h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_W
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江理工大學《語文教學理論與實踐(1)》2023-2024學年第一學期期末試卷
- 鄭州輕工業(yè)大學《軟件開發(fā)管理程》2023-2024學年第一學期期末試卷
- 小學學校章程
- 浙江電力職業(yè)技術學院《電視原理B》2023-2024學年第一學期期末試卷
- 漳州職業(yè)技術學院《信號與系統(tǒng)》2023-2024學年第一學期期末試卷
- 生產(chǎn)調(diào)度與庫存管理協(xié)同效應
- 財務年終總結報告模板
- 雙十一新媒體營銷報告模板
- 生物醫(yī)療研究總結模板
- 房地產(chǎn)交易制度政策-《房地產(chǎn)基本制度與政策》模擬試卷2
- DB11∕T 353-2021 城市道路清掃保潔質(zhì)量與作業(yè)要求
- 中醫(yī)特色科室創(chuàng)建
- 多旋翼無人機駕駛員執(zhí)照(CAAC)備考試題庫大全-上部分
- Unit 2 同步練習人教版2024七年級英語上冊
- JGJ94-2008建筑樁基技術規(guī)范
- 電子產(chǎn)品模具設計
- (正式版)JBT 11270-2024 立體倉庫組合式鋼結構貨架技術規(guī)范
- 失能老年人的護理與康復
- 微信小程序運營投標方案(技術方案)
- 布氏桿菌脊柱炎的護理
- 教育培訓行業(yè)跨學科教育發(fā)展
評論
0/150
提交評論