linux多線程試驗報告_第1頁
linux多線程試驗報告_第2頁
linux多線程試驗報告_第3頁
linux多線程試驗報告_第4頁
linux多線程試驗報告_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗八Linux多線程實驗報告撰寫人專業(yè)班級j學號姓名完成時間0 0 0 2,0 0 0 000 0 0實驗目的1、了解什么是多線程,熟悉LINUX的多線程機制;2、掌握利用信號處理Linux多線程的同步問題;3、掌握利用信號量處理Linux多線程的互斥問題;4、運用Linux多線程的同步機制和互斥機制實現(xiàn)生產(chǎn)者消費者的編程。二、實驗內容1. “生產(chǎn)者-消費者”問題如下:有一個有限緩沖區(qū)和兩個線程:生產(chǎn)者和消費者。他們分別不停地把產(chǎn)品放入緩沖區(qū)、從緩 沖區(qū)中拿走產(chǎn)品。一個生產(chǎn)者在緩沖區(qū)滿的時候必須等待,一個消費者在緩沖區(qū)空的時候也必須等待。另外,因為緩沖區(qū)是臨界資 源,所以生產(chǎn)者和消費者之間必

2、須互斥執(zhí)行。它們之間的關系如圖 1所示。現(xiàn)在要求使用共享內存來模擬有限緩沖區(qū),并且使用信 號量來解決“生產(chǎn)者-消費者”問題中的同步和互斥問題。生產(chǎn)者和消費者問題描述2.問題描述:假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一:吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也 停止吃東西。餐桌中間有一大碗意大利面,每兩個哲學家之間有一只餐叉。因為用一只餐叉很難吃到意大利面,所以假設哲學家必須用兩只餐叉吃東西。 他們只能使用自己左右手邊的那兩只餐叉。請用Linux線程編程解決。三、實驗過程與結果步驟一:編寫的文件操作過程 ra!mim m 在不 “譯錯誤一一-y -,一-解決1

3、_方法-r 1 HU IIj器中for 循環(huán)的用 法不太一 樣,在這 里最好不 要使用 for (inti=0 ;)最好 在外聲明 int i 在 for循環(huán) 里直接寫 i=0._.一:6 unSn scnvn su;/sen union .用于初jfi化信號量:T */:a struct mbuffer凈£:0tnthead;,1tnttail;2 char £tMAXUFFER SIZE;tntnu伸二/螳源區(qū)里字母數(shù)*;14 tntts_empty;15 Lnst tnt M CQW5UHER =燈揖箜者數(shù)量Tconst tnt N_PRODUCER = 2;/? 數(shù)

4、量<B const tnt N二BUFF ER =";繾沖區(qū)容IS const 5t N MORKTIHE 工露”工作次數(shù)10 tnt shn_id = -1;,1 tnt sen_id = -1;i2 Did t child;,3 pid_tL4 "覆到工。以內的一個隨機數(shù),5 tnt get_rndom() -步驟二:編譯代碼并且運行代碼I Lnuj(buntu04'vn:*/iMorkdtrS qcc produce1 r _t ustoneri»c *o custoper -Ipthread ltnuxgutiuntu64-vn:*/work

5、dtr$ ,/customer步驟三:運行完畢后,顯示以下代碼:生產(chǎn)者消費者先后生產(chǎn)數(shù)據(jù)以及取出數(shù)據(jù),此程序中設置了兩個消費者兩個生產(chǎn)i者,交替進行生產(chǎn)數(shù)據(jù)消費數(shù)據(jù)。我是第J個生產(chǎn)者道程,PID = 332J執(zhí)行時間;Hud Apr 24 19:5e:47 2619凌博區(qū)數(shù)據(jù)(3個):LLL生產(chǎn)有1放入L我是第1個消費者進程, P】口 = 332S執(zhí)行時間:Ned Apr 24 19; 5譏 52 2019緩沖區(qū)數(shù)據(jù)(2) : LL 消費者1取出,U.我是第2個生產(chǎn)者進科, PID - 3 3Z4執(zhí)行時間:Wed Apr 74 n:5D:59 7019緩沖區(qū)數(shù)據(jù) 仃個):FLL生產(chǎn)者2放入-F

6、卜 H 4 il-S B J, s a_* d ill I -i !實步驟一:驗編寫的文件我是第2個消費者進程r PID = 3 376執(zhí)行時間;Wed Apr " 19:5L(M 2019族沖區(qū)數(shù)據(jù)C個):FL 消黃老?取出L 我是第1個牛產(chǎn)者進程.PID = 3323執(zhí)行忖I司:口式 Apr 24 19 : 51® 2019痍沖區(qū)敢據(jù)(3個):QFL 生產(chǎn)者1放入 Q'.tideftn? N 5“督學充我ITSdeftne LEFTadeftne n:lGHT(.t)define HUM用丫U"饑戰(zhàn)toe THINKIMCi。思考MTIMGU_5EOH

7、DiBfrffoea /i門在手邊區(qū)學花展號 打右手邊哲家號邸In 匚 tude<pthread th> , In 匚 11Mde1M手 cmpho r u 卜 人 .Winclyde<tirie.h>nt*x; 互斥事tot -.tarerul;"記錄每個昔學家狀態(tài)"駕個斯學家的同年時間,蹤事時幀,思考開澗向,屹依開的啊clcc!ls_t thinking tiRefN eating_tliE N B start eatLng_tlLr*ErN' start thlnkingtime"線程的數(shù)void *thread_fuinct

8、tOin(¥otd *arg);tnt iMitnOP"thread_ni&rteK_init(fiiflutexkULL);步驟二:編譯代碼并且運行代碼suffer_max-5Gltnuxgubuntu64-vm;/workdtrS cc philosopher,c -o phll -LpthreadLinuubuntu647m»/wokdt$ Jphtl步驟三:0 0 0 9 20 2 0 3 20 10 0 2!0 12 9 2縉0 12 9 1E士 t-2 12 0 12 113 1!i-2 112 1iI1112 1-:二-11111二 t _1

9、 e 1 1 1!i'''12 111ii- 112 0 111縉- - - 1-12 0 10工;:t -12 0 12i-r-6 2 0 12Ii部 0 2 0 11.番Q 1 0 1 1 - ,:-2 10 11i-. -1 -2 12 11Ii2 12 0 1繾 ,112 0 1實驗一:11!*1#include <>11#include <>!i 實 #include <>1 iI1驗 #include <>代 j#include <sys/>!碼 |#include <sys/>1 小1

10、1#include <sys/>|#include <sys/>ii上#define MAX_BUFFER_SIZE 101 ;,#define SHM_MODE 0600#define SEM_MODE 0600# define SEM_FULL 0# define SEM_EMPTY 1# define MUTEX 2/*# if defined(_GNU_LIBRARY_) && !defined(_SEM_SEMUN_UNDEFINED) n", i + 1, c);fflush(stdout); sigSem(sem_id, MUTE

11、X); sigSem(sem_id, SEM_FULL);一 一n", i + 1, lt);fflush(stdout);sigSem(sem_id,MUTEX); sigSem(sem_id,SEM_EMPTY); /將共享段與進程之間解除連接 shmdt(shmptr);exit(0);/主進程最后退出while (wait(0) != -1);/將共享段與進程之間解除連接shmdt(shmptr);/對共享內存區(qū)執(zhí)行控制操作shmctl(shm_id,IPC_RMID,0);/ 當 cmd為 IPC_RMID9,刪除該共享段shmctl(sem_id,IPC_RMID,0);

12、printf(" 主進程運行結束! n");fflush(stdout);exit(0);return 0;實驗二:#include<sys/>#include<>#include<>#include<>#include<>#include<>#include<># define N 5 / 哲學家數(shù)量# define LEFT(i) (i+N-1)%N /左手邊哲學家編號# define RIGHT(i) (i+1)%N /右手邊哲家編號# define HUNGRY 0/饑餓# defi

13、ne THINKING 1/思考# define EATING 2/吃飯rii#de巾ne U_SECOND 1000000 /1 秒對應的微秒數(shù)pthread_mutex_t mutex; / 互斥量int stateN; /記錄每個哲學家狀態(tài)/每個哲學家的思考時間,吃飯時間,思考開始時間,吃飯開始時間clock_t thinking_timeN, eating_timeN, start_eating_timeN, start_thinking_timeN;7線程而雙void *thread_function(void *arg);int main()pthread_mutex_init(&

14、amp;mutex, NULL);»Ipthread_t a,b,c,d,e;/為得一個哲學家開啟一個線程,傳遞哲學家編號pthread_create(&a,NULL,thread_function,"0");pthread_create(&b,NULL,thread_function,"1");pthread_create(&c,NULL,thread_function,"2");pthread_create(&d,NULL,thread_function,"3");pt

15、hread_create(&e,NULL,thread_function,"4");/初質化隨機數(shù)種子一srand(unsigned int)(time(NULL);while(1) ;void *thread_function(void *arg) ichar *a = (char *)arg;| int num = a0 - '0' /根據(jù)傳遞參數(shù)獲取哲學家編號int rand_time;while(1) (i !/ 關鍵代碼加鎖!pthread_mutex_lock(&mutex);! i/加果該自學家處于饑餓并且左右兩位哲學家都沒有在

16、吃飯就i|拿起叉子吃飯if(statenum= HUNGRY&& stateLEFT(num) != EATING &&stateRIGHT(num) != EATING) r (statenum = EATING;i start_eating_timenum = clock(); /記錄開始吃飯時間!Ieating_timenum = (rand() % 5 + 5) * U_SECOND; /隨機生!1成吃飯時間一一1!/輸出狀態(tài)!p printf("state: %d %d %d %d %dn",state0,state1,state2

17、,state3,stat| e4);|/printf("%d is eatingn",num);II!else if(statenum = EATING)(|/吃飯時間已到,開始思考if(clock()- start_eating_timenum >= eating_timenum)/i11 j1_ statenum = THINKING; /printf("%d is thinkingn",num);printf("state: %d %d %d %d %dn",state0,state1,state2,state3,stat

18、 e4);start_thinking_timenum 一 clock(); /記錄開始思考時問一一thinking_timenum = (rand() % 10 + 10) * U_SECOND; /隨機生成思考時間)else if(statenum = THINKING)(/思考一定時間后,哲學家餓了,需要吃飯if(clock()-start thinking timenum>= 一 一thinking timenum)一 statenum = HUNGRY;printf("state: %d %d %d %d %dn",state0,state1,state2,state3,st

溫馨提示

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

評論

0/150

提交評論