實驗四同步及互斥Linux實驗報告_第1頁
實驗四同步及互斥Linux實驗報告_第2頁
實驗四同步及互斥Linux實驗報告_第3頁
實驗四同步及互斥Linux實驗報告_第4頁
實驗四同步及互斥Linux實驗報告_第5頁
全文預覽已結束

下載本文檔

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

文檔簡介

1、-. z.實驗四同步與互斥【實驗目的和要求】1、掌握進程線程的同步與互斥。2、掌握生產(chǎn)者消費者問題的實現(xiàn)方法。3、掌握多線程編程方法。【實驗內(nèi)容】實現(xiàn)生產(chǎn)者消費者問題1、有一個倉庫,生產(chǎn)者負責生產(chǎn)產(chǎn)品,并放入倉庫,消費者會從倉庫中拿走產(chǎn)品(消費)。2、倉庫中每次只能入一個(生產(chǎn)者或消費者)。3、倉庫中可存放產(chǎn)品的數(shù)量最多10個,當倉庫放滿時,生產(chǎn)者不能再放入產(chǎn)品。4、當倉庫空時,消費者不能從中取出產(chǎn)品。5、生產(chǎn)、消費速度不同?!緦嶒炘怼啃盘柫縨ute*提供對緩沖池訪問的互斥要求并初始化為1,信號量empty和full分別用來表示空緩沖項和滿緩沖項的個數(shù),信號量empty初始化為n,信號量fu

2、ll初始化為0。2、定義如下構造及數(shù)據(jù):定義緩沖區(qū)內(nèi)的數(shù)據(jù)類型:typedefintbuffer_item;緩沖區(qū):buffer_itembufferBUFFER_SIZE;對緩沖區(qū)操作的變量:intin,out;信號量mute*提供了對緩沖池訪問的互斥要求:pthread_mute*_tmute*;信號量empty和full分別表示空緩沖頂和滿緩沖頂?shù)膫€數(shù):sem_tempty,full;可以設定生產(chǎn)者的生產(chǎn)速度及消費者的消費速度:intpro_speed,con_speed;對緩沖區(qū)操作的自增函數(shù):#defineinc(k)if(kBUFFER_SIZE)k=k+1;elsek=03、并定

3、義了如下實現(xiàn)問題的函數(shù)模塊:將生產(chǎn)的產(chǎn)品放入緩沖區(qū):intinsert_item(buffer_itemitem)從緩沖區(qū)內(nèi)移走一個產(chǎn)品:intremove_item(buffer_item*item)生產(chǎn)者進程:void*producer(void*param)消費者進程:void*consumer(void*param)生產(chǎn)者構造進程消費者構造進程【程序代碼】/s*.c#include#include#include#include#include#define inc(k) if(kBUFFER_SIZE) k=k+1;else k=0#define BUFFER_SIZE 10/緩沖區(qū)

4、的大小typedef int buffer_item;/定義緩沖區(qū)內(nèi)的數(shù)據(jù)類型buffer_item bufferBUFFER_SIZE;/緩沖區(qū)int in,out;/對緩沖區(qū)操作的變量pthread_mute*_t mute*;/信號量mute*提供了對緩沖池訪問的互斥要求sem_t empty,full;/信號量empty和full分別表示空緩沖頂和滿緩沖頂?shù)膫€數(shù)int pro_speed,con_speed;/可以設定生產(chǎn)者的生產(chǎn)速度及消費者的消費速度int insert_item(buffer_item item)/將生產(chǎn)的產(chǎn)品放入緩沖區(qū)bufferin=item;printf(*i

5、nsert緩沖池第%d號*n,in);inc(in);int remove_item(buffer_item *item)/從緩沖區(qū)內(nèi)移走一個產(chǎn)品*item = bufferout;printf(*remove緩沖池第%d號*n,out);inc(out);void *producer(void *param)/生產(chǎn)者進程buffer_item item;int num = 0;while(1)sleep(rand()%(16-pro_speed);printf(n*第%d次生產(chǎn)*n,+num);printf(*等待empty信號*n);sem_wait(&empty);printf(*等待解

6、鎖*n);pthread_mute*_lock(&mute*);printf(*上鎖,準備生產(chǎn)*n);item = rand()%1000+1; printf(*生產(chǎn)產(chǎn)品%d*n,item);insert_item(item);printf(*解鎖*n);printf(*第%d次生產(chǎn)完畢*nn,num);pthread_mute*_unlock(&mute*);sem_post(&full);void *consumer(void *param)/消費者進程buffer_item item;int num = 0;while(1)sleep(rand()%(16-con_speed);prin

7、tf(n*第%d次消費*n,+num);printf(*等待full信號*n);sem_wait(&full);printf(*等待解鎖*n);pthread_mute*_lock(&mute*);printf(*上鎖,準備消費*n);remove_item(&item);pthread_mute*_unlock(&mute*);sem_post(&empty);printf(*消費產(chǎn)品%d*n,item);printf(*解鎖*n);printf(*第%d次消費完畢*nn,num); int main()/主函數(shù)pthread_t tid1,tid2;pthread_attr_t attr1

8、,attr2;srand(time(NULL);pthread_mute*_init(&mute*,NULL);/初始化sem_init(&empty,0,BUFFER_SIZE);sem_init(&full,0,0);in=0;out=0;printf(*n);printf(*開場!*n);printf(*n);printf(生產(chǎn)者速度(1-15):n);scanf(%d,&pro_speed);printf(消費者速度(1-15):n);scanf(%d,&con_speed);pthread_attr_init(&attr1);pthread_create(&tid1,&attr1,p

9、roducer,NULL);pthread_attr_init(&attr2);pthread_create(&tid2,&attr2,consumer,NULL);sleep(100);printf(*程序over*n);return 0;【實驗步驟】編寫程序代碼gedit s*.c,再對代碼進展編譯gcc s*.c o s* lpthread,編譯無錯誤,進展運行./s*,根據(jù)提示要求進展填寫生產(chǎn)者和消費速度,觀察消費者和生產(chǎn)者進程。【實驗結果】【實驗體會】1、Linu*中生成線程方法:第一種方式是用pthread 庫來實現(xiàn)的,是在用戶程序本身中實現(xiàn)線程,這實際上是對線程的一種模擬,線程之

10、間的切換和調(diào)度是在用戶的進程內(nèi)部進展的,這種方式就被稱為用戶空間的線程。這種線程的好處是實現(xiàn)非常簡單,性能也非常好,因為線程之間的切換都在用戶進程內(nèi)部進展,切換開銷比擬小。缺點也非常明顯,首先就是不能充分利用高端系統(tǒng)的SMP多處理器的優(yōu)點,因為一個進程只能由一個處理器處理,第二點由于用戶空間是在用戶空間切換,*個線程遇到一個需要阻塞的系統(tǒng)調(diào)用進而就會造成這個進程被阻塞,因而所有線程被阻塞。第二種方式是通過修改良程的實現(xiàn)方式來完成,可以使用不完全的進程創(chuàng)立方式創(chuàng)立共享數(shù)據(jù)空間的進程,在Linu*下這種系統(tǒng)調(diào)用為clone()。2、Ptrtead生成線程: POSI* thread簡稱為pthread,Posi*線程是POSI*標準線程該標準定義內(nèi)部API創(chuàng)立和操縱線程。數(shù)據(jù)類型 pthread_t:線程句柄 pthread_attr_t:線程屬性線程操縱函數(shù)(省略參數(shù)):pthread_create():創(chuàng)立一個線程pthread_e*it():終止當前線程pthread_cancel():中斷另外一個線程的運行pthread_join():阻塞當前的線程,直到另外一個線程運行完畢pthread_a

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論