多線程讀者寫者優(yōu)先實驗報告_第1頁
多線程讀者寫者優(yōu)先實驗報告_第2頁
多線程讀者寫者優(yōu)先實驗報告_第3頁
多線程讀者寫者優(yōu)先實驗報告_第4頁
多線程讀者寫者優(yōu)先實驗報告_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、多線程編程 實驗報告1、 實驗目的1、 熟悉多線程編程2、 熟悉使用信號量機制解決進程同步問題2、 實驗內(nèi)容在 Windows 2000 環(huán)境下,創(chuàng)建一個包含n 個線程的控制臺進程。用這n 個線程來表示 n 個讀者或?qū)懻摺?每個線程按相應測試數(shù)據(jù)文件的要求, 進行讀寫操作。 請用信號量機制分別實現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。讀者優(yōu)先: 如果一個讀者申請進行讀操作時已有另一讀者正在進行讀操作, 則該讀者可直接開始讀操作。寫者優(yōu)先: 如果一個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源, 則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。3、 實驗條件1、為每個學生提供一臺具有W

2、INDOWS 2000/NT/XP 操作系統(tǒng)的計算機;2、實驗機器要求安裝Visual C+ 6.0 編程平臺;3、實驗要求一人一機。4、 運行結(jié)果顯示要求1、 要求在每個線程創(chuàng)建、 發(fā)出讀寫操作申請、 開始讀寫操作和結(jié)束讀寫操作時分別顯示一行提示信息,以確信所有處理都遵守相應的讀寫操作限制。2、 測試數(shù)據(jù)文件格式:測試數(shù)據(jù)文件包括n 行測試數(shù)據(jù),分別描述創(chuàng)建的 n 個線程是讀者還是寫者, 以及讀寫操作的開始時間和持續(xù)時間。 每行測試數(shù)據(jù)包括四個字段, 各字段間用空格分隔。第一字段為一個正整數(shù),表示線程序號。第二字段表示相應線程角色, R表示讀者是, W 表示寫者。第三字段為一個正數(shù),表示讀寫

3、操作的開始時間。線程創(chuàng)建后,延時相應時間(單位為秒)后發(fā)出對共享資源的讀寫申請。第四字段為一個正數(shù), 表示讀寫 操作的持續(xù)時間。 當線程讀寫申請成功后, 開始對共享資源的讀寫操作, 該操作持續(xù)相應時 間后結(jié)束,并釋放共享資源。下面是一個測試數(shù)據(jù)文件的例子:1 R 3 52 W 4 53 R 5 24 R 6 53、 若有可能請在圖形方式下,將讀、寫者線程執(zhí)行情況用圖形動畫顯示5、 實驗源程序#include<windows.h>#include<conio.h>#include<stdlib.h>#include<fstream.h>#inclu

4、de<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ù)目# define MAX_STR_LEN 32/int readcount=0;/int writecount=0;/CRITICAL_SECTION RP

5、_Write; / 臨界資源CRITICAL_SECTION RP_Write_Reader; / 臨界資源 int choice=0;struct ThreadInfoint serial;/ 線程序號char entity;/ 線程類別double delay;/ 線程延遲時間,即開始時間double persist;/線程讀寫操作時間;void RP_ReaderThread (void *p)HANDLE h_Mutex;/ HANDLE s_Mutex;/ s_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_readORw

6、riter");h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_readcount");DWORD wait_for_mutex;DWORD m_delay;DWORD m_persist;int m_serial;m_serial=(ThreadInfo*)(p)->serial;m_delay=(DWORD)(ThreadInfo*)(p)->delay * INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)->persist * INTE_P

7、ER_SEC);Sleep(m_delay);/printf(" 讀線程 %d 發(fā)出請求 .n",m_serial);cout<<" 讀線程 "<<m_serial<<" 發(fā)出讀請求"<<endl;if (choice=1)EnterCriticalSection(&RP_Write_Reader);wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/ wait_for_mutex=WaitForSingleObject(s_Mutex

8、,-1);if(readcount=0)EnterCriticalSection(&RP_Write);readcount+;ReleaseMutex(h_Mutex);if (choice=1)LeaveCriticalSection(&RP_Write_Reader);/ ReleaseMutex(s_Mutex);/printf(" 讀進程 %d 開始讀文件.n",m_serial);cout<<" 讀線程 "<<m_serial<<" 開始讀文件"<<endl;S

9、leep(m_persist);/printf(" 讀進程 %d 結(jié)束讀文件.n",m_serial);cout<<" 讀線程 "<<m_serial<<" 結(jié)束讀文件."<<endl;wait_for_mutex=WaitForSingleObject(h_Mutex,-1);readcount-;if(readcount=0)LeaveCriticalSection(&RP_Write);ReleaseMutex(h_Mutex);void RP_WriteThread(vo

10、id *p)DWORD m_delay;DWORD m_persist;int m_serial;/HANDLE s_Mutex;/DWORD wait_for_mutex;/ s_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_readORwriter");m_serial=(ThreadInfo*)(p)->serial;m_delay=(DWORD)(ThreadInfo*)(p)->delay*INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)->per

11、sist*INTE_PER_SEC);Sleep(m_delay);cout<<" 寫進程 "<<m_serial<<" 發(fā)出寫請求*"<<endl;if (choice=1)EnterCriticalSection(&RP_Write_Reader);/ wait_for_mutex=WaitForSingleObject(s_Mutex,-1);EnterCriticalSection(&RP_Write);cout<<" 寫進程"<<m_se

12、rial<<" 開始寫文件"<<endl;Sleep(m_persist);cout<<" 寫進程"<<m_serial<<" 結(jié)束寫文件"<<endl;LeaveCriticalSection(&RP_Write);if (choice=1)LeaveCriticalSection(&RP_Write_Reader);/ ReleaseMutex(s_Mutex);void ReadPriority(char *file)DWORD n_thre

13、ad=0;DWORD thread_ID;DWORD wait_for_all;HANDLE h_Mutex;HANDLE s_MUTEX;h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_readcount");s_MUTEX=CreateMutex(NULL,FALSE,"mutex_for_readerORwriter");HANDLE h_ThreadMAX_THREAD_NUM;ThreadInfo thread_infoMAX_THREAD_NUM;readcount=0;InitializeCritical

14、Section(&RP_Write);InitializeCriticalSection(&RP_Write_Reader);ifstream inFile;inFile.open(file);while(inFile)inFile>>thread_infon_thread.serial;cout<<thread_infon_thread.serial<<'t'inFile>>thread_infon_thread.entity;cout<<thread_infon_thread.entity<&

15、lt;'t'inFile>>thread_infon_thread.delay;cout<<thread_infon_thread.delay<<'t'inFile>>thread_infon_thread.persist;cout<<thread_infon_thread+.persist<<'t'inFile.get();cout<<endl;inFile.close();for(int i=0;i<(int)(n_thread);i+)if(threa

16、d_infoi.entity=READER|thread_infoi.entity='R') h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread), &thread_infoi,0,&thread_ID);elseh_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriteThread), &thread_infoi,0,&thread_ID);wait_for_all=WaitForMult

17、ipleObjects(n_thread,h_Thread,TRUE,-1);cout<<" 所有線程運行完畢"<<endl;int main()int n;cout<<"輸入你的選擇:n1:讀者優(yōu)先n2:讀者優(yōu)先n3:退出n"<<endl;cin>>n;while(n!=3)switch (n)case 1:choice=0;ReadPriority("1.txt");break;case 2:choice=1;ReadPriority("1.txt")

18、;break;default:break;cout<<"輸入你的選擇:n1:讀者優(yōu)先n2:寫者優(yōu)先n3:退出n"<<endl; cin>>n;system("PAUSE");return 0;六實驗結(jié)果首先選擇讀者優(yōu)先,第一次選擇,把讀入的文件信息輸出。八C+®序、操作系統(tǒng)實整咨粉、線程Dbbn式線程.蓮先先的但K鹿再退一請M受饒出始出出留出費 ;"芬發(fā)奉港毒 1123 35 4-4-323112345sawwi程程靠線線進線域進線線線讀讀三譙法與讀讀讀止件件吐匕.F 史文文文文將 諛寫寫富點軋 i中士口及士口、正理弟弟你者者) 線進重進更讀寫浪 詼耳寫耳m所輸工q!h-.選擇寫者優(yōu)先:由,C+程序作春統(tǒng)實鎏名僑線程TDebugA領(lǐng)程-eB*-JJ J*曹元:鑄一青遼選先先道,讀寫退LI-叫F聃 L2:3:求 l> 可 出1 1 2,h -J- -!.

溫馨提示

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

評論

0/150

提交評論