生產(chǎn)者與消費(fèi)者算法的實(shí)現(xiàn)_第1頁
生產(chǎn)者與消費(fèi)者算法的實(shí)現(xiàn)_第2頁
生產(chǎn)者與消費(fèi)者算法的實(shí)現(xiàn)_第3頁
生產(chǎn)者與消費(fèi)者算法的實(shí)現(xiàn)_第4頁
生產(chǎn)者與消費(fèi)者算法的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)六信號(hào)量l=J廈門大學(xué)軟件學(xué)院吳清強(qiáng)實(shí)驗(yàn)?zāi)康募訌?qiáng)對(duì)進(jìn)程概念的理解。進(jìn)一步了解并發(fā)執(zhí)行的實(shí)質(zhì)。分析進(jìn)程爭(zhēng)用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法 了解Linux系統(tǒng)中進(jìn)程通信的基本原理二.相關(guān)知識(shí)進(jìn)程的概念。進(jìn)程與程序的區(qū)別。進(jìn)程并發(fā)執(zhí)行的概念。進(jìn)程互斥的概念 進(jìn)程通信的基本原理三.實(shí)驗(yàn)內(nèi)容使用信號(hào)量實(shí)現(xiàn)有限緩沖區(qū)的生產(chǎn)者和消費(fèi)者問題使用信號(hào)量實(shí)現(xiàn)讀進(jìn)程具有優(yōu)先權(quán)的讀者和寫者問題實(shí)驗(yàn)環(huán)境 PC + Linux Red Hat 操作系統(tǒng) GCC1.使用信號(hào)量實(shí)現(xiàn)有限緩沖區(qū)的生產(chǎn)者和消費(fèi)者問題.程序流程圖生產(chǎn)者進(jìn)程生產(chǎn)流程圖消費(fèi)者進(jìn)程消費(fèi)流程圖源代碼1、生產(chǎn)者生產(chǎn)進(jìn)程函數(shù)DWORD WINAPI P

2、roducer(LPVOID lpParameter)(while(true)(for(int j=0;j4;j+)(if(bufferj=0)(/找 到空緩沖區(qū)if(lockj=false)/同步鎖為false,可以進(jìn)行操作 lockj=true;/加鎖,防止其他線程操作此緩沖區(qū) if(bufferj1)/限艮定一個(gè)緩沖區(qū)只能存放一個(gè)資源+bufferj;/模擬生產(chǎn)資源cout”生產(chǎn)一個(gè)資源,放入緩沖區(qū)”j中”endl;lockj=false;/解鎖break;/ 次生產(chǎn)一個(gè)if(j=3)cout找不到空緩沖區(qū),等待中。endl;Sleep(2000);return 0;2、消費(fèi)者消費(fèi)進(jìn)程函

3、數(shù)DWORD WINAPI Customer(LPVOID lpParameter)while(true)for(int n=0;n=1)-buffern;/模擬消費(fèi)資源cout消費(fèi)一個(gè)資源,從緩沖區(qū)n中取出endl;lockn=false;/解 鎖break;/一 次生產(chǎn)一個(gè)if(n=3)cout”找不到滿緩沖區(qū),等待中。:ohrnr 0 2 1nrraqo 0 3qn0 區(qū)時(shí)區(qū)區(qū)區(qū)。雕區(qū)區(qū)區(qū)震。區(qū)區(qū)噩區(qū) 沖區(qū)區(qū)區(qū):區(qū)區(qū)區(qū)區(qū)*貴區(qū)區(qū)沖 緩:.入美入入入入入入?yún)^(qū)區(qū)區(qū)區(qū)9 原源源源源-00-源源源源源源源源-00-源源源源源ke一 一一一產(chǎn)費(fèi)產(chǎn)產(chǎn)產(chǎn)不不費(fèi)費(fèi)產(chǎn)產(chǎn)產(chǎn)費(fèi)費(fèi)費(fèi)費(fèi)不不產(chǎn)產(chǎn)費(fèi)費(fèi)產(chǎn) _生消生生

4、生生生生生生碧生一一 一一一 一引一一一一3, *C: Progra FilesMicrosoft Visual StudioByPro jectsDebug.1、一個(gè)生產(chǎn)者生產(chǎn),一個(gè)消費(fèi)者消費(fèi):需二毯I:牖搬客出1、兩個(gè)生產(chǎn)者連續(xù)生產(chǎn),兩個(gè)消費(fèi)者連續(xù)消費(fèi):產(chǎn)產(chǎn)I4 02 護(hù)ff口口區(qū)區(qū) ESHff出出取職2、多個(gè)生產(chǎn)者于多個(gè)消費(fèi)者進(jìn)行生產(chǎn)消費(fèi)操作泉原原泉原LB&B扉原原原原.國(guó) 1 ,JP .Jrr 7t . 1V 1. HIP .Jlr ./PI ?lr Jlrl 個(gè)個(gè)個(gè)個(gè)空空個(gè)個(gè)個(gè)!1/! -一一一 產(chǎn)產(chǎn)費(fèi)產(chǎn)產(chǎn)產(chǎn)不不費(fèi)費(fèi)產(chǎn)出出出出出&-B-聚口 口口 E0E1W區(qū)區(qū)區(qū)出出取取翠取取-2-

5、2 0 。 。就區(qū)區(qū)區(qū)0 2 3 I 區(qū)ffffff口口 區(qū)區(qū)護(hù)ffff區(qū)區(qū)區(qū)IE 入入入入2.使用信號(hào)量實(shí)現(xiàn)讀進(jìn)程具有優(yōu)先權(quán)的讀者和寫者問題一、程序流程圖二、 源代碼#include#include#include#include#include#includeint critical;int createSem()/創(chuàng)建信 號(hào)量return semget(key_t)1000,2,IPC_CREATI0600);/the second parameter in semget is the number of signal we will createvoid initSignal(int

6、semid,int index,int value)/初 始化信號(hào)量semctl(semid,index,SETVAL,value);void make_critical () 創(chuàng)建緩沖區(qū)critical=mmap(NULL,10*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED| MAP_ANONYMOUS,-1,0);critical0=-1;/the value of the critical file is init as -1 critical1=0;/the reader count is 0;void semWait(int semid,in

7、t index)/判斷當(dāng)前進(jìn)程是否進(jìn)入緩沖區(qū),被占用 就掛起struct sembuf sem_buf;sem_buf.sem_num=index;sem_buf.sem_op=-1;sem_buf.sem_flg=SEM_UNDO;semop(semid,&sem_buf,1);void semSignal(int semid,int index)/喚醒一個(gè)在阻塞隊(duì)列中等待的進(jìn)程struct sembuf sem_buf;sem_buf.sem_num=index;sem_buf.sem_op=1;sem_buf.sem_flg=SEM_UNDO;semop(semid,&sem_buf,1

8、);為了讓讀者優(yōu)先,當(dāng)讀者獲得控制權(quán)時(shí),寫者進(jìn)程必須掛起;當(dāng)?shù)谝?個(gè)讀者進(jìn)程到來(等到寫者進(jìn)程釋放控制權(quán))時(shí),第一個(gè)讀者進(jìn)程獲得 優(yōu)先權(quán),接著其他讀者進(jìn)程不再等待,同時(shí)執(zhí)行。/故而用critical1記錄讀者進(jìn)程讀到的內(nèi)容,用semid0控制讀者或?qū)?者進(jìn)程,用semid1更新critical1的值void reader(int semid)while(1)semWait(semid,1);critical1+;if(critical1=1)semWait(semid,0);semSignal(semid,1);/correctly update the reader countprintf(

9、reader: read value %dn”,critical0);semWait(semid,1);critical1-;/have read it readers have decreased update it correctlyif(critical1=0)/no readerssemSignal(semid,0);/free the ownership of readerssemSignal(semid,1);void writer(int semid)while(1)semWait(semid,0);printf(input:);scanf(%d,&critical0);prin

10、tf(writer: write after update value is %dn,critical0);semSignal(semid,0);int main()int semid=createSem();initSignal(semid,0,1);/初始化控制寫者信號(hào)量WinitSignal(semid,1,1);/初始化控制讀者信號(hào)量R/the critical number is init as -1 the writer will update itmake_critical();/create critical regionpid_t child=fork();if(child=

11、0)reader(semid);elsewriter(semid);return 0;實(shí)驗(yàn)結(jié)果:文件(E)德網(wǎng) 查看M 興端標(biāo)密擔(dān)荷助roatl ocal hos t、戶 gee o Read liidWrite oirt Read And ri t e,crootl calhusl 1 . ./Read ndri Lt. utreader: read value -1input 21234writer: wri te after update a1ue is 1234re&dcr: read Baltic 1.2Mreader: read i-atue 1234input:234writer

12、: ri te after update talue is 234reader? rcM 234input346vrri lorvri ic after update taiuc i s 346reader: read value 346input:1336writer wri te after up*Jate alue is 1356readers rad inluc 135*6input:2356wri ters write after update valoc Is 2356re&Jer: re&d value 235tiinpulN57wriLer wrile after update

13、 value is 457reader: read va1w J57input8734writer: ffri te after update a1ue i s 8734reader: read, value 8734input: 12wri ter: wri te &f les update xalue i s 12reader: read value 12inpuL:2Swriter: wri te after update value is 25readers read value 25input:547wri Lcrs till after Lipdutt 氣i h j47reader

14、: read vaiue 547input:|五、實(shí)驗(yàn)總結(jié).這次多線程的操作系統(tǒng)實(shí)驗(yàn),使我對(duì)線程的概念 以及多線程程序中線程間的運(yùn)行有了更深的認(rèn)識(shí),同 時(shí)也讓我的編程能力得到了一定的提高。這次做的用多線程實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者模型的實(shí)驗(yàn), 由于我的編程能力基礎(chǔ)比較差,對(duì)線程也是一無所知, 所以一開始覺得無從下手,但幸好老師給了充足的時(shí) 間,我通過看網(wǎng)上找的視頻資料以及請(qǐng)教同學(xué)才漸漸地有了一點(diǎn)概念,然后我試著從網(wǎng)上下了一些多線程 的程序分析里面的語句,基本弄懂了多線程的原理附:#include iostream.h#include windows.h#include stdio.hbool lock

15、4=false,false,false,false;/四把鎖,分別對(duì)四個(gè)緩沖區(qū)進(jìn)行同步 int buffer4=0,0,0,0;/緩沖區(qū),表示資源的個(gè)數(shù)void display()coutendl;cout緩沖區(qū)0123endl;for(int i=0;i4;i+)cout bufferi;coutendl; DWORD WINAPI Producer(LPVOID lpParameter) while(true)for(int j=0;j4;j+)if(bufferj=0)/ 找到空緩沖區(qū)if(lockj=false)/同步鎖為false,可以進(jìn)行操作 lockj=true;/加鎖,防止其他

16、線程操作此緩沖區(qū) if(bufferj1)/限定一個(gè)緩沖區(qū)只能存放一個(gè)資源 +bufferj;/模擬生產(chǎn)資源cout生產(chǎn)一個(gè)資源,放入緩沖區(qū)j中”vvendl; lockj=false;/解 鎖break;/ 一次生產(chǎn)一個(gè)if(j=3)cout找不到空緩沖區(qū),等待中。endl;Sleep(2000);return 0;DWORD WINAPI Customer(LPVOID IpParameter)while(true)(for(int n=0;n=1)-buffern;/模擬消費(fèi)資源cout”消費(fèi)一個(gè)資源,從緩沖區(qū)”n”中取出”endl;lockn=false;/ 解鎖 break;/ 一次生產(chǎn)一個(gè)if(n=3)cout找不到滿緩沖區(qū),等待中。endl;Sleep(2000);return 0;int main(int argc,char* argv)display();HANDLE handle3;DWORD dw1,dw2,dw3,dw4,dw0;handle0=CreateThread(NULL,0,Pro

溫馨提示

  • 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. 人人文庫(kù)網(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)論