用多線程同步方法解決生產(chǎn)者_第1頁
用多線程同步方法解決生產(chǎn)者_第2頁
用多線程同步方法解決生產(chǎn)者_第3頁
用多線程同步方法解決生產(chǎn)者_第4頁
用多線程同步方法解決生產(chǎn)者_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 TOC o 1-5 h z HYPERLINK l bookmark7 o Current Document 需求分析1 HYPERLINK l bookmark11 o Current Document 1.1課程設(shè)計題目1 HYPERLINK l bookmark14 o Current Document 1.2課程設(shè)計任務(wù)1 HYPERLINK l bookmark20 o Current Document 1.3課程設(shè)計原理1 HYPERLINK l bookmark23 o Current Document 1.4課程設(shè)計要求1 HYPERLINK l bookmark30 o C

2、urrent Document 1.5實驗環(huán)境1 HYPERLINK l bookmark33 o Current Document 概要設(shè)計2 HYPERLINK l bookmark37 o Current Document 2.1課程設(shè)計方案概述2 HYPERLINK l bookmark40 o Current Document 2.2課程設(shè)計流程圖2 HYPERLINK l bookmark43 o Current Document 詳細設(shè)計3 HYPERLINK l bookmark47 o Current Document 3.1主程序模塊3 HYPERLINK l bookma

3、rk50 o Current Document 3.2 生產(chǎn)者程序模塊4 HYPERLINK l bookmark53 o Current Document 3.3消費者程序模塊5 HYPERLINK l bookmark56 o Current Document 調(diào)試中遇到的問題及解決方案5 HYPERLINK l bookmark63 o Current Document 運行結(jié)果6 HYPERLINK l bookmark67 o Current Document 實驗小結(jié)7 HYPERLINK l bookmark70 o Current Document 參考文獻7 HYPERLIN

4、K l bookmark78 o Current Document 附錄:源程序清單7需求分析1.1課程設(shè)計題目用多線程同步方法解決生產(chǎn)者一消費者問題1.2課程設(shè)計任務(wù)每個生產(chǎn)者和消費者對有界緩沖區(qū)進行操作后,即時顯示有界緩沖區(qū)的全部內(nèi)容、當(dāng)前指針位置和生產(chǎn)者/消費者線程的標(biāo)識符。生產(chǎn)者和消費者各有兩個以上。多個生產(chǎn)者或多個消費者之間須共享對緩沖區(qū)進行操作的函數(shù)代碼。1.3課程設(shè)計原理生產(chǎn)者和消費者問題是從操作系統(tǒng)中的許多實際同步問題中抽象出來的具有代表性的問題,它反映了操作系統(tǒng)中典型的同步例子,生產(chǎn)者進程(進程由多個線程組成)生產(chǎn)信息, 消費者進程使用信息,由于生產(chǎn)者和消費者彼此獨立,且運行

5、速度不確定,所以很可能出現(xiàn)生產(chǎn) 者已產(chǎn)生了信息而消費者卻沒有來得及接受信息這種情況。為此,需要引入由一個或者若干個存 儲單元組成的臨時存儲區(qū)(即緩沖區(qū)),以便存放生產(chǎn)者所產(chǎn)生的信息,解決平滑進程間由于速 度不確定所帶來的問題。1.4課程設(shè)計要求有界緩沖區(qū)內(nèi)設(shè)有20個存儲單元,放入/取出的數(shù)據(jù)項設(shè)定為120這20個整型數(shù)。每個生產(chǎn)者和消費者對有界緩沖區(qū)進行操作后,即時顯示有界緩沖區(qū)的全部內(nèi)容、當(dāng)前指針位置和生產(chǎn)者/消費者線程的標(biāo)識符。生產(chǎn)者和消費者各有兩個以上。多個生產(chǎn)者或多個消費者之間須共享對緩沖區(qū)進行操作的函數(shù)代碼。1.5實驗環(huán)境系統(tǒng)平臺:LINUX開發(fā)語言:C開發(fā)工具:PC機一臺概要設(shè)計2

6、.1課程設(shè)計方案概述本設(shè)計中設(shè)置一個長度為20的一維數(shù)組buff20作為有界緩沖區(qū),緩沖區(qū)為0時,代表該 緩沖區(qū)內(nèi)沒有產(chǎn)品,buffi=i+1表示有產(chǎn)品,產(chǎn)品為i+1。設(shè)置3個同步信號燈:一個說明空緩沖區(qū)的數(shù)目,用empty表示,其初值為有界緩沖區(qū)的大 小20 ;另一個說明滿緩沖區(qū)(即產(chǎn)品)的數(shù)目,用full表示,其初值為0。由于緩沖區(qū)是臨界 資源,必須互斥使用,所以還設(shè)置了一個互斥信號燈mutex,其初值為1。用這3個信號燈有效 控制多個生產(chǎn)者線程和多個消費者線程的同步準(zhǔn)確的運行。Main()函數(shù)中調(diào)用函數(shù)sem_init()對信號燈進行初始化;利用for語句循環(huán)創(chuàng)建5個 producer(

7、生產(chǎn)者)分離線程和5個consumer(消費者)分離線程;Producer線程通過調(diào)用函數(shù) sem_wait(&empty)判斷是否有空緩沖區(qū)。若無,則阻塞當(dāng)前線程,若有則調(diào)用函數(shù) sem_wait(&mutex)等待對臨界資源的操作權(quán),當(dāng)mntex為1時,便獲得臨界資源的操作權(quán),可 將產(chǎn)品放入緩沖區(qū),及時輸出緩沖區(qū)里的內(nèi)容。然后依次調(diào)用函數(shù)sem_post(&mutex)和sem_post(&full)來釋放緩沖區(qū)操作權(quán)和增加滿緩沖區(qū)信號量的值;Consumer線程通過調(diào)用函 數(shù)sem_wait(&full)判斷是否有滿緩沖區(qū)。若無,則阻塞當(dāng)前線程,若有則調(diào)用函數(shù) sem_wait(&mut

8、ex)等待對臨界資源的操作權(quán),當(dāng)mntex為1時,便獲得臨界資源的操作權(quán),可 從滿緩沖區(qū)中取出產(chǎn)品消費,并及時輸出緩沖區(qū)里的內(nèi)容。然后依次調(diào)用函數(shù)sem_post(&mutex) 和sem_post(&emptyl)來釋放緩沖區(qū)操作權(quán)和增加空滿緩沖區(qū)信號量的值。Producer和Consumer線程中均用緩沖區(qū)指針b指出當(dāng)前是對哪一個緩沖區(qū)進行放入/取出操作;并調(diào)用 pthread_self()函數(shù)來顯示其自身的標(biāo)識符。2.2課程設(shè)計流程圖設(shè)計中主要有三個模塊,首先從主程序中進入,完成初始化及創(chuàng)建好生產(chǎn)者和消費 者線程后,進入生產(chǎn)者或消費者模塊,具體流程見程序設(shè)計流程圖如圖1所示:生產(chǎn)者消費者

9、圖1程序設(shè)計流程圖詳細設(shè)計3.1主程序模塊主程序中利用函數(shù) sem_init()對信號燈進行初始化;利用 for語句循環(huán)創(chuàng)建3個 producer(生產(chǎn)者)分離線程和3個consumer(消費者)分離線程,程序段如下:int main(void)( int i;initbuff();for(i=0;i5;i+)pthread_create(&id1i,NULL,(void *)producer,(&i);創(chuàng)建生產(chǎn)者線程for(i=0;i5;i+)pthread_create(&id2i,NULL,(void *)consumer,(&i);創(chuàng)建消費者線程for(i=0;i5;i+) pthre

10、ad_join(id1i,NULL);pthread_join(id2i,NULL); exit(0); /等待生產(chǎn)者線程,消費者線程,結(jié)束主線程3.2生產(chǎn)者程序模塊Producer線程通過調(diào)用函數(shù)sem_wait(&empty)判斷是否有空緩沖區(qū)。若無,則阻塞 當(dāng)前線程,若有則調(diào)用函數(shù)sem_wait(&mutex)等待對臨界資源的操作權(quán),當(dāng)mntex為 1時,便獲得臨界資源的操作權(quán),可將產(chǎn)品放入緩沖區(qū),及時輸出緩沖區(qū)里的內(nèi)容;并 用指針b指出當(dāng)前是對哪一個緩沖區(qū)進行放入/取出操作,且調(diào)用pthread_self()函數(shù)來 顯示其自身的標(biāo)識符。然后依次調(diào)用函數(shù)sem_post(&mutex)

11、和 sem_post(&full)來釋放 緩沖區(qū)操作權(quán)和增加滿緩沖區(qū)信號量的值,程序段如下: void producer()/生產(chǎn)者 int pid=0;int j,k;pid=pthread_self();/獲得生產(chǎn)者標(biāo)識符while(1) for(j=0;j5;j+) if(pid=id1j) k=j+1; sem_wait(&empty);/P操作,判斷緩沖區(qū)是否有空位置sem_wait(&mutex);/P操作,獲得對臨界資源的操作權(quán)if(p%21!=0) buffb=p%21;printf(producer %d produce:%dn”,k,p%21);printbuff();b+

12、;p+; else p+;sem_post(&mutex); /V操作,釋放臨界資源sem_post(&full);/V操作,滿緩沖區(qū)信號燈加1sleep(4); 3.3消費者程序模塊Consumer線程調(diào)用調(diào)用函數(shù)sem_wait(&full)判斷是否有滿緩沖區(qū)。若無,則阻塞 當(dāng)前線程,若有則調(diào)用函數(shù)sem_wait(&mutex)等待對臨界資源的操作權(quán),當(dāng)mntex為1 時,便獲得臨界資源的操作權(quán),可從滿緩沖區(qū)中取出產(chǎn)品消費,并及時輸出緩沖區(qū)里的 內(nèi)容,并用指針b指出當(dāng)前是對哪一個緩沖區(qū)進行放入/取出操作,且調(diào)用pthread_self() 函數(shù)來顯示其自身的標(biāo)識符。然后依次調(diào)用函數(shù)sem

13、_post(&mutex)和 sem_post(&emptyl) 來釋放緩沖區(qū)操作權(quán)和增加空滿緩沖區(qū)信號量的值,程序段如下:void consumer()/消費者 int cid=0;int j,k;cid=pthread_self();/獲得消費者標(biāo)識符while(1) for(j=0;j5;j+) if(cid=id2j) k=j+1; sem_wait(&full); /P操作,判斷緩沖區(qū)是否已滿sem_wait(&mutex);/P操作,獲得對臨界資源的操作權(quán)if(c%21!=0) c1=buffb-1;printf(consumer %d consume:%dn”,k,c1);buf

14、fb-1=0;printbuff();b;c+; else c+;sem_post(&mutex);/V操作,釋放臨界資源sem_post(&empty);/V操作,釋放一個空位置sleep(6); 調(diào)試中遇到的問題及解決方案在調(diào)試過程中主要遇到三個問題:在設(shè)計剛完成的時候,我并沒有用pid=pthread_self()和cid=pthread_self()來獲 得生產(chǎn)者和消費者的標(biāo)識符,所以運行的結(jié)果是生產(chǎn)者和消費者的標(biāo)識符都是隨機的,后 來問同學(xué)才找到這種調(diào)用方法。我想讓生產(chǎn)者無限的生產(chǎn),消費者無限的消費,所以就用了一個條件判斷語句,判斷 的條件是p%21!=0,而我寫成了 p/21!=0

15、,所以運行的結(jié)果是生產(chǎn)者的生產(chǎn)是混亂的,沒 有規(guī)律。剛開始我的運行結(jié)果還有一個問題就是生產(chǎn)者生產(chǎn)超過21的產(chǎn)品后,產(chǎn)品號不是1, 2等,而是 21,22,,后來檢查后才發(fā)現(xiàn) printf(producer %d produce:%dn,k,p%21) 中的產(chǎn)品號不是p%21,所以出現(xiàn)那種情況。運行結(jié)果顯示結(jié)果如下:(部分運行結(jié)果)host jc 1 pt bread -o *hj ocal host . /whjproducec 1 produce:1datas i nbuff are:1 000Q0Q0000Q0Q0Q0Q00prcduccr2 produce:2Jatas inbuff a

16、re:1 200Q000000Q000Q0000producec3 produceddatas i nbuff are:1 230QQ00Q00QQ00QQ000prcduccr4 produce:4datas i nbuff are;1 234QQ00Q00QQ00QQ000producec5 produce:5datas i nbuff are:1 2345Q00Q0QQQ00QQ000consurttcr1 conUnc:5datas i nbuff are;1 234QQ00Q00QQ00QQ000consurtMic-2 conUrtKi:4datas i nbuff are:1 2

17、30QQ00Q00QQ00QQ000consurttcr3 conUtMi:3datas i nbuff are;1 200QQ00Q00QQ00QQ000consurtMic-4 conUrtKi:2datas i nbuff are:1 000QQ00Q00QQ00QQ00Qconsurttcr5 consurtMi: 1datas i nbuff are:0 Q00QQ00Q00QQ00QQ00Qproducc:-1 produce:datas i nbuff areifi Q00QQ00Q00QQ00QQ00Qprcduccr2 produce:7datas i nbuff are:6

18、 700QQ00Q00QQ00QQ00Qproducc:-3 produceddatas i nbuff areifi 7&0QQ00Q00QQ00QQ00Qprcduccr4 produce:9datas i nbuff7Sg0Q000000Q000Q00Qproducce- 5 produce: 106.實驗小結(jié)這次課程設(shè)計主要針對的是操作系統(tǒng)中的經(jīng)典問題即:生產(chǎn)者一一消費者問題使用多線 程控制,剛拿到設(shè)計題目時心里其實挺沒底的,因為之前我對線程不是很了解,不過幸好老 師上課的時候給了我們一個關(guān)于Linux多線程編程的文檔,里面詳細的介紹了線程的一些 基本命令,所以我在這次設(shè)計中基本上都用

19、的是文檔里的命令。從這次課程設(shè)計中,我對線程的概念以及一些命令都有了一定的理解和掌握,并且也知 道了它與進程之間的區(qū)別,除此之外,通過這次課程設(shè)計讓我對操作系統(tǒng)中的經(jīng)典問題,生 產(chǎn)者一一消費者問題有了更深的理解,在做設(shè)計的過程中,也對上課的內(nèi)容加深了理解并進 行了鞏固。參考文獻龐麗萍.操作系統(tǒng)原理.華中科技大學(xué)出版社.2009年1月。蔣靜徐志偉.操作系統(tǒng)原理技術(shù)與編程M.北京:機械工業(yè)出版社,2004張紅光 李福才.UNIX操作系統(tǒng)。機械工業(yè)出版社。2006年1月湯子瀛等.計算機操作系統(tǒng).西安電子科技大學(xué)出版社.2001年5月付國瑜楊武周敏.計算機操作系統(tǒng)原理及應(yīng)用上機實驗指導(dǎo).重慶工學(xué)院計算

20、機學(xué) 院.2005年1月.附錄:源程序清單#include #include#include#includeint buff20 = 0; /有界緩沖區(qū)定義int b=0;/緩沖區(qū)的輸出指針int p=1;int c=1;int c1=0;/消費數(shù)據(jù)變量sem_t full;/緩沖區(qū)的數(shù)量信號燈sem_t empty;/緩沖區(qū)滿信號燈sem_t mutex;/互斥信號燈pthread_t id15;pthread_t id25;void initbuff()/初始化信號燈 sem_init(&full,0,0);sem_init(&empty,0,20);sem_init(&mutex,0,1

21、); /初始化互斥信號燈void printbuff()/打印緩沖區(qū) int j;printf(datas in buff are:);for(j=0;j20;j+)printf(%d ”,buffj);printf(n); void producer()/生產(chǎn)者 int pid=0;int j,k;pid=pthread_self();while(1) for(j=0;j5;j+) if(pid=id1j) k=j+1; sem_wait(&empty);sem_wait(&mutex);if(p%21!=0) buffb=p%21;printf(producer %d produce:%dn”,k,p%21);printbuff();b+;p+; else p+;sem_post(&mutex);sem_post(&full);sleep(4); void consumer()/消費者 int cid=0;int j,k;cid=pthread_self

溫馨提示

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

評論

0/150

提交評論