




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
電子科技大學信息與軟件學院實驗報告(實驗)課程名稱計算機操作系統(tǒng)學生姓名康彪學生學號2013220202022電子科技大學教務處制表實驗名稱:生產(chǎn)者/消費者問題的實現(xiàn)實驗學時:2實驗內(nèi)容和目的:實驗目的:通過本實驗掌握進程間的同步和互斥機制的使用。實驗內(nèi)容:1、有一群生產(chǎn)者進程在生產(chǎn)產(chǎn)品,并將這些產(chǎn)品提供給消費者進程去消費。為使生產(chǎn)者進程與消費者進程能并發(fā)執(zhí)行,在兩者之間設置了一個具有n個緩沖區(qū)的緩沖池:生產(chǎn)者進程從文件中讀取一個數(shù)據(jù),并將它存放到一個緩沖區(qū)中;消費者進程從一個緩沖區(qū)中取走數(shù)據(jù),并輸出此數(shù)據(jù)。生產(chǎn)者和消費者之間必須保持同步原則:不允許消費者進程到一個空緩沖區(qū)去取產(chǎn)品;也不允許生產(chǎn)者進程向一個已裝滿產(chǎn)品且尚未被取走的緩沖區(qū)中投放產(chǎn)品。2、創(chuàng)建3進程(或者線程)作為生產(chǎn)者,4個進程(或者線程)作為消費者。創(chuàng)建一個文件作為數(shù)據(jù)源,文件中事先寫入一些內(nèi)容作為數(shù)據(jù)。3、生產(chǎn)者和消費者進程(或者線程)都具有相同的優(yōu)先級。實驗原理:利用進程間共享的信號量、互斥鎖等控制線程的同步。相關函數(shù)說明:信號量sem_tsem_init信號量初始化)、sem_wait(信號量值減一)、sem_post(信號量值加一)互斥量(線程)pthread_mutex_tpthread_mutex_init(互斥量初始化)pthread_mutex_lock(互斥量加鎖)pthread_mutex_unlock(互斥量解鎖)線程和進程pthread_t(線程)pid_t(進程)pthread_create(創(chuàng)建線程)fork(創(chuàng)建進程)pthread_join(等待線程結束)waitpid(停止目前進程的執(zhí)行,直到有信號來到或子進程結束)實驗器材(設備、元器件)學生每人一臺PC,安裝WindowsXP/2000操作系統(tǒng)。局域網(wǎng)絡環(huán)境。個人PC安裝VMware虛擬機和Ubuntu系統(tǒng)。實驗步驟:1.算法思想生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。
消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。
當生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū)。
當消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來。
2.流程圖3.程序代碼#include<windows.h>#include<iostream.h>#include<fstream.h>#include<string.h>#include<conio.h>//聲明所需變量intin=0;intout=0;HANDLEh_Thread[20];//線程數(shù)組HANDLEempty_Semaphore;//表示空緩沖區(qū)的信號量HANDLEfull_Semaphore;//表示空緩沖區(qū)的信號量HANDLEmutex;structdata{intID;//序號chartype;//類型,是生產(chǎn)者還是消費者,porcdoubledelay;//線程延遲的時間,對應生產(chǎn)者生產(chǎn)產(chǎn)品的時間或消費者消費產(chǎn)品的時間};dataThreadInfo[20];//線程信息數(shù)組intlength;//線程信息數(shù)組中實際的線程個數(shù)voidProduce(void*p);//生產(chǎn)者進程voidConsume(void*p);//消費者進程voidinput(void);intmain(void){input();//初始化臨界區(qū)對象//InitializeCriticalSection(&PC_Critical);empty_Semaphore=CreateSemaphore(NULL,10,10,NULL);full_Semaphore=CreateSemaphore(NULL,0,10,NULL);mutex=::CreateMutex(NULL,FALSE,NULL);cout<<"下面生產(chǎn)者和消費者開始工作!!"<<endl;cout<<endl;//創(chuàng)建生產(chǎn)者和消費者線程for(inti=0;i{if(ThreadInfo[i].type=='p')h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),&(ThreadInfo[i]),0,NULL);elseif(ThreadInfo[i].type=='c')h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume),&(ThreadInfo[i]),0,NULL);}//主程序等待各個線程的動作結束WaitForMultipleObjects(length,h_Thread,TRUE,-1);cout<<endl;::Sleep(100);cout<<"所有的生產(chǎn)者和消費者都完成了它們的工作!!"<<endl<<endl;return0;}//*****************************************************************************************//生產(chǎn)者進程//******************************************************************************************voidProduce(void*p){//局部變量聲明intmy_id;doublemy_delay;//從線程信息數(shù)組中獲得信息my_id=((data*)(p))->ID;my_delay=((data*)(p))->delay;//開始請求生產(chǎn)WaitForSingleObject(empty_Semaphore,-1);::WaitForSingleObject(mutex,-1);//EnterCriticalSection(&PC_Critical);cout<<"生產(chǎn)者"<<my_id<<"發(fā)出生產(chǎn)請求。"<<endl;cout<<endl;cout<<"生產(chǎn)者"<<my_id<<"生產(chǎn)......"<<endl;in=(in+1);Sleep(my_delay*10);cout<<"生產(chǎn)者"<<my_id<<"完成了生產(chǎn)。"<<endl<<endl;//LeaveCriticalSection(&PC_Critical);ReleaseSemaphore(full_Semaphore,1,NULL);::ReleaseMutex(mutex);}//*****************************************************************************************//消費者進程//******************************************************************************************voidConsume(void*p){//局部變量聲明intmy_id;doublemy_delay;//從線程信息數(shù)組中獲得信息my_id=((data*)(p))->ID;my_delay=((data*)(p))->delay;//開始請求消費WaitForSingleObject(full_Semaphore,-1);::WaitForSingleObject(mutex,-1);//EnterCriticalSection(&PC_Critical);cout<<"消費者"<<my_id<<"發(fā)出消費請求。"<<endl;cout<<endl;cout<<"消費者"<<my_id<<"消費......"<<endl;out=(out+1);Sleep(my_delay*10);cout<<"消費者"<<my_id<<"完成了消費。"<<endl<<endl;//LeaveCriticalSection(&PC_Critical)ReleaseSemaphore(empty_Semaphore,1,NULL);::ReleaseMutex(mutex)}//*****************************************************************************************//輸入進程信息的函數(shù)//******************************************************************************************voidinput(void){//定義局部變量intid;charch;doubletime;intk=0;cout<<"********請輸入線程信息:"<<endl;cout<<"********線程ID;"<<endl;cout<<"********線程的類型(生產(chǎn)者線程,還是消費者線程,p代表生產(chǎn)者,c代表消費者);"<<endl;cout<<"********線程延遲時間。"<<endl;cout<<"********線程ID為0時結束線程信息的輸入!!"<<endl<<endl;while(id!=0){cout<<"pleaseinputathreadID."<<endl;cin>>id;ThreadInfo[k].ID=id;if(id==0)break;cout<<"pleaseinputathreadtype."<<endl;cin>>ch;ThreadInfo[k].type=ch;cout<<"pleaseinputathreaddelaytime:"<<endl;cin>>time;ThreadInfo[k].delay=time;k++;}length=k;cout<<endl<<"您輸入的線程信息為:"<<endl;for(intj=0;j{cout<<"thread"<<ThreadInfo[j].ID<<""<<ThreadInfo[j].type<<""<<ThreadInfo[j].delay<<endl;}}實驗及結果分析: 能夠正確模擬生產(chǎn)者
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 海豐地基加固施工方案
- 防水的施工方案
- 自拌混凝土施工方案
- 河源頂管施工方案
- 泥漿護壁施工方案
- 軟件培訓方案
- 二零二五年度果樹種植土地托管承包與農(nóng)村金融創(chuàng)新合作協(xié)議
- 2025年度汽車維修行業(yè)安全生產(chǎn)責任簡易合同
- 二零二五年度高科技研發(fā)項目勞務合同風險評估書
- 二零二五年度健康醫(yī)療合伙投資公司股權合作協(xié)議
- 七年級數(shù)學新北師大版(2024)下冊第一章《整式的乘除》單元檢測習題(含簡單答案)
- 《工程熱力學》課件-11 理想氣體熱力學能、焓和熵的計算
- 發(fā)票知識培訓課件
- 《英國小說家羅琳》課件
- 《綜合辦崗位職責》課件
- 學校與家庭在學生心理健康中的協(xié)同作用
- 大學英語翻譯課件
- 薄膜電容項目立項申請報告
- 《中醫(yī)望聞問切》課件
- 教師師德師風考核細則
- 聲帶腫物的護理教學查房
評論
0/150
提交評論