版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、生產(chǎn)者消費(fèi)者實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)二生產(chǎn)者與消費(fèi)者進(jìn)程實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)?zāi)康模豪肳indows提供的API函數(shù),編寫程序,解決生產(chǎn)者與消費(fèi)者問題,實(shí)現(xiàn) 進(jìn)程的互斥與同步。實(shí)驗(yàn)內(nèi)容與步驟:1. 進(jìn)程的互斥與同步。編寫一段程序,模擬生產(chǎn)者和消費(fèi)者線程,實(shí)現(xiàn)進(jìn)程的互 斥與同步。2. 利用VC+6.0 實(shí)現(xiàn)上述程序設(shè)計(jì)和調(diào)試操作,對(duì)于生產(chǎn)者和消費(fèi)者線程操作 的成功與否提供一定的提示框。3. 通過閱讀和分析實(shí)驗(yàn)程序,熟悉進(jìn)程的互斥與同步的概念。程序設(shè)計(jì)思路:關(guān)于這個(gè)生產(chǎn)者與消費(fèi)者進(jìn)程,我主要設(shè)計(jì)了兩個(gè)線程,一個(gè)生產(chǎn)者線程,一個(gè) 消費(fèi)者線程。整個(gè)進(jìn)程隨著這兩個(gè)線程的創(chuàng)建,運(yùn)行,終止而進(jìn)行。在程序的開始,首先我創(chuàng)建了一個(gè)
2、結(jié)構(gòu)struct,它包括的基本數(shù)據(jù)有:生產(chǎn)物品 緩沖區(qū)(用隊(duì)列來表示),一個(gè)標(biāo)志緩沖區(qū)空間多少的信號(hào)量m_S_Empty ,一個(gè)標(biāo)志緩沖區(qū)已有物品多少的信號(hào)量m_S_Full,個(gè)互斥信號(hào)量m_M_Mutex 防止生產(chǎn)者與消費(fèi)者同時(shí)訪問緩沖區(qū)間,一個(gè)判斷生產(chǎn)者是否要結(jié)束生產(chǎn)的bool類型標(biāo)志producerfinished,若為true,則兩個(gè)線程都終止。進(jìn)入主程序以后,首先對(duì)這些struct中的基本數(shù)據(jù)進(jìn)行一個(gè)個(gè)賦值,然后創(chuàng)建生 產(chǎn)者與消費(fèi)者兩個(gè)線程,等待兩個(gè)線程都結(jié)束時(shí),關(guān)閉進(jìn)程。要知道在main主函數(shù)中兩個(gè)線程的創(chuàng)建語句就是對(duì)兩個(gè)線程各自進(jìn)入函數(shù)的運(yùn)行,生產(chǎn)者函數(shù)中通過一個(gè)for循環(huán),可以
3、控制生產(chǎn)者進(jìn)行多次生產(chǎn),不是生產(chǎn) 一次就結(jié)束了。消費(fèi)者函數(shù)中通過一個(gè) while循環(huán),當(dāng)生產(chǎn)者沒有結(jié)束生產(chǎn)時(shí)可 以控制消費(fèi)者進(jìn)行多次消費(fèi),不是消費(fèi)一次就不會(huì)再來消費(fèi)了,除非生產(chǎn)者已結(jié) 束生產(chǎn),即producerfinished的值變?yōu)閠rue 。實(shí)驗(yàn)主要程序及注釋:#include stdafx.h#include #include #include#include using namespacestd;DWORD WINAPI Consume void*);/聲明消費(fèi)者函數(shù)DWORD WINAPI Produced void*); /聲明生產(chǎn)者函數(shù)#define N 10/定義緩沖區(qū)數(shù)量/*
4、數(shù)據(jù)結(jié)構(gòu)的定義*/struct MyDataHANDLE m_S_Empty; / 生產(chǎn)者 SemaphoreHANDLE m_S_Full; / 消費(fèi)者 SemaphoreHANDLE m_M_Mutex; /互斥信號(hào)量queue food; /定義共享緩沖區(qū)bool producerfinished;/標(biāo)志著生產(chǎn)者是否結(jié)束生產(chǎn);int j=0;只是為了輸岀方便觀察線程執(zhí)行次數(shù)int main()/*對(duì)各個(gè)信號(hào)量賦值*/MyData mydata;/創(chuàng)建一個(gè)MyData數(shù)據(jù)類型的實(shí)體mydatamydata.m_M_Mutex = CreateMutex(NULL, false, NULL)
5、; /false表示剛剛創(chuàng)建的這個(gè)信號(hào)量不屬 于? N任何線程mydata.m_S_Empty = CreateSemaphore(NULL, N, N, NULL); /初始計(jì)數(shù)為 Nmydata.m_S_Full = CreateSemaphore(NULL, 0, N, NULL); /初始計(jì)數(shù)為 0 ducerfinished=false;/生產(chǎn)者結(jié)束標(biāo)志剛開始設(shè)置為 false,表示沒有結(jié)束/*創(chuàng)建生產(chǎn)者和消費(fèi)者線程*/HANDLE handles2;handles0 = CreateThread(NULL,0,&Producer,( void*)&mydata,
6、0,0);handles1 = CreateThread(NULL,0,&Consumer,( void*)&mydata,0,0);WaitForMultipleObjects(2, handles, true, INFINITE); / 等待兩個(gè)線程都結(jié)束才往下執(zhí)行CloseHandle(mydata.m_M_Mutex);CloseHandle(mydata.m_S_Full);CloseHandle(mydata.m_S_Empty);/*生產(chǎn)者函數(shù)*/DWORD WINAPI Producer( void* lp)MyData * md = (MyData*)lp;for(int i
7、 =0 ; i m_S_Empty, INFINITE);/ 緩沖區(qū)有空間才可以往下WaitForSingleObject(md-m_M_Mutex, INFINITE);/消費(fèi)者沒有在操作緩沖區(qū)生產(chǎn)者才可以執(zhí)行/*將所生產(chǎn)的物品放到指定的緩沖區(qū)中*/md-food.push(1);printf( %dt 生產(chǎn) 1 個(gè)物品,共有%d 個(gè)物品 tt%dn ,j+,md-food.size(),GetCurrentThreadId(); 輸出緩沖區(qū)信息以及線程信息ReleaseMutex(md-m_M_Mutex);/ /釋放互斥信號(hào)量ReleaseSemaphore(md-m_S_Full, 1
8、, NULL);/ 有物品的緩沖區(qū)增加一個(gè)md-producerfinished=true;若岀了 for循環(huán),生產(chǎn)者結(jié)束生產(chǎn),控制消費(fèi)者線程結(jié)束 return 0;/*消費(fèi)者函數(shù)*/DWORD WINAPI Consume void* lp)MyData * md = (MyData*)lp;while(!md-producerfinished)若生產(chǎn)者沒有結(jié)束生產(chǎn),可以繼續(xù)往下執(zhí)行 WaitForSingleObject(md-m_S_Full,INFINITE);/ / 若緩沖區(qū)沒有空,則可以往下執(zhí)行 WaitForSingleObject(md-m_M_Mutex,INFINITE);
9、若生產(chǎn)者沒有在操作緩沖區(qū),則消費(fèi)則可以操作/*消費(fèi)一個(gè)物品*/md-food.pop();printf(”dt 消費(fèi) 1 個(gè)物品,共有 %d個(gè)物品 tt%dn ,j+,md-food.size(),GetCurrentThreadId(); 輸 出緩沖區(qū)信息以及線程信息ReleaseMutex(md-m_M_Mutex); / /釋放互斥信號(hào)量ReleaseSemaphore(md-m_S_Empty,1,NULL); 空緩沖區(qū)增加一個(gè)return 0;實(shí)驗(yàn)中遇到的問題及解決:我的這個(gè)程序是結(jié)合了老師ppt上給的程序框架,然后理解了精品課程上給的 程序自己重新整理寫的??蠢蠋熃o的框架一目了然,
10、沒有什么大的問題,我先說一下在理解老師給的程序 中碰到的問題:1. 對(duì)于程序的開始(int)(double)rand()/(double)RAND_MAX)*100)這個(gè)不理解是什么意思,后來經(jīng)過查找資料得知rand()是產(chǎn)生一個(gè)隨機(jī)數(shù),RAND_MAX是隨機(jī)數(shù)中 最大的那個(gè)數(shù),所以(double)rand()/(double)RAND_MAX 一定是產(chǎn)生一個(gè)01之間的 數(shù),在*100則產(chǎn)生的是0100之間的整數(shù)。2. 不明白為什么要?jiǎng)?chuàng)建一個(gè)struct,把線程中要用到的數(shù)據(jù)信號(hào)量都放在這個(gè)數(shù)據(jù)結(jié)構(gòu)中。經(jīng)過后來對(duì)程序的思考,發(fā)現(xiàn)在CreateThread(0,0,&threadProducer
11、,( void*)&mydata, 0,0);倉建線程的函數(shù)中可以直接通過(void*)&mydata將所有線程要使用的數(shù)據(jù)都傳入線程,比較方便。所以我在自己的 程序中也仿照類似的方法,創(chuàng)建了一個(gè)數(shù)據(jù)結(jié)構(gòu)。3. 在結(jié)構(gòu)struct中對(duì)兩個(gè)數(shù)據(jù)的用處比較迷惑,最后還是在我自己寫程序的時(shí)候又回過來思考這兩個(gè)數(shù)據(jù)才發(fā)現(xiàn)他們的用處,首先是bool producerfinished;我在自己寫程序的時(shí)候,剛開始沒有用到這個(gè)變量,所以在消費(fèi)者線程中沒有寫while循環(huán),運(yùn)行以后發(fā)現(xiàn)消費(fèi)者線程在出現(xiàn)一次以后就不會(huì)再出現(xiàn),也是由此我才發(fā)現(xiàn)是不是應(yīng)該要加一個(gè)循環(huán),他才會(huì)運(yùn)行多次,所以我就想到了boolprodu
12、cerfinished;變量,通過它來控制while循環(huán),當(dāng)生產(chǎn)者線程結(jié)束后,它的值變?yōu)閠rue,消費(fèi) 者不能再次進(jìn)入消費(fèi),否則可以在緩沖區(qū)有物品的情況下繼續(xù)消費(fèi)。然后就是信號(hào)量HANDLE controlsemaphore;在我自己的程序中沒有用到這個(gè)變量。 不 過我還是很好奇它的用處,然后我發(fā)現(xiàn)老師的程序在判斷food().size0 的時(shí)候 才可以消費(fèi),若不大于0,則必須要經(jīng)過生產(chǎn)者生產(chǎn)以后也就是說釋放一個(gè)HANDLE controlsemaphore以后,消費(fèi)者才能繼續(xù)消費(fèi),防止生產(chǎn)者不生產(chǎn),消費(fèi)者 盲目得在等待。4.對(duì)于 WaitForMultipleObjects(3, handl
13、es, true, INFINITE);語句不理解,查閱資料以后發(fā)現(xiàn)他的意思true是要等到3個(gè)線程都結(jié)束以后才能 往下執(zhí)行,若為false,則其中一個(gè)線程結(jié)束了就可以往下執(zhí)行。實(shí)驗(yàn)結(jié)果截圖:3(W23092804 3092804 3R92 RCM3092804 30928043092804 3092804 3092804 30928043092804 309280430928M43092804 30928043092804309290430928043W28b4 30928043092RR43092804品品口ysonnssss品品品品品ZJwnn品sss品品品品品品口晉no口習(xí)習(xí)QQfi品
14、品品品品;Jgogonn品sfi 1212121212121212121212121212121212121212121 有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有 共共共共共共共共卄八比八共共共共共九生共共共共共共共共共共#共艾卄八共共共共共共共共共共升品品口yyoo品口QQ品S品品品品品口ynn品口晉晉晉習(xí)WQQ口習(xí)世DQ口習(xí)on品口an口QQS品曲品品品口習(xí)習(xí)口習(xí)晉QQ vvvvvvvvvultobzvvvvvvjvvuvvvvvvblbzvvvvvvvv1111111111111111111111111111111111111111111 產(chǎn)
15、產(chǎn)費(fèi)產(chǎn)君產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)嚴(yán)費(fèi)產(chǎn)S產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)S產(chǎn)費(fèi)產(chǎn)費(fèi)一廣費(fèi)產(chǎn)費(fèi)產(chǎn)產(chǎn)費(fèi)產(chǎn)費(fèi) 生(二消U1生消M消竺消=!= 一消上消竺消1二消上_消4二消一二消X消乞消工消二消4IU 一消r消上一消0 12 3 40 1234567890 1234567890 123456789012789111111111122222222223333333333444C:Users/kdministr3torDocufnentsVisu3l Stud o 2010xProjectsS5Debugt;.exe3(W280430928043092RIM3R92804309280430928043W280430928
16、04309280420928043092804309280430928043092804 3092dM3092804909280430928043W280430928043R928043092品品口wSDao品品品SI品品品品品口智習(xí)習(xí)gososo?wDQ品DSODn口wnn品品口Da品品品品品品口 30習(xí)習(xí)習(xí)zs 21212121212121212121 2 1 212121212121212121212 有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有w 共共共共共共共共卄掘八共共共共共九共共共共共共共共共共共#共艾卄八共共共共共共共共共共i品品口 sa
17、yoos口QQ品S品品品品品口ynn口習(xí)晉晉習(xí)習(xí)習(xí)習(xí)習(xí)ggDQ口習(xí)an口習(xí)an口QQS品曲品品品口習(xí)習(xí)on口習(xí)晉QQ 功軻助砌捕劭揃功功物砌功功功砌功揃功物功功功砌砌 vvvvvvvvvultobzvvvvvvjvvuvvvvvvblbzvvvvvvvv 1111111111111111111111111111111111111111111 嚴(yán)費(fèi).曹嚴(yán)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)替產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)管產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)s產(chǎn)費(fèi)產(chǎn) 生消U-消r帝乞消片一消士亠消么一消匕帝0消上一消蘭消消蘭冷u清匕消蘭消消=一消八二消上H-3456789ol23456789fil23456?8Jb 441490123
18、4 5 67UO9-01234555555555566666 6 667777777777888888012345678?0123456789012345678 6?890123456789000fiflo000H1111111111222222222 8 8 00 00 9 9 9 9 y tH tH tH t丄丄 1 丄lTH yH Tl丄 1 丄丄 1 1 1 i 丄804 3092804 3092804 3R92RCM3092804 3092804 3092804 3092804 3092804 30928043092804 309280430928M43092804 3092804
19、30928043092904 30928043W28b4 3092804 3092RR43092804品品口wSDaa品品品口no品品品品品口 gjnnu習(xí)智習(xí)習(xí)習(xí)習(xí)曲品口智刖口wnn品品口Da品品品品品品口 gogDnna習(xí)習(xí) 1212121212121212121212121212121212121212121 有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有有 共共共共共共共共卄八比八共共共共共九生共共共共共共共共共共#共艾卄八共共共共共共共共共共d品品口 gagaoos口QQ品S品品品品品口ynn口習(xí)晉晉晉習(xí)WQQ口習(xí)世DQ口習(xí)on口nn品口QQS品曲
20、品品品口習(xí)習(xí)口習(xí)晉 助軻物砌捕劭功功)功助功功砌砌功捕功物物功功砌功 L*ublb bubbuuuuJfl uuuuub bbbbbbuLr一消工消二消4IU 一消r消上一消sjd5no _TFITTTTTTTTTTIFTTTTTTTTTTFTTTTTTTTTTTVFITTTTT 厶厶 9999999999SSCHSSSSGCHSpppAAAbbcEEEz T 0 6 8 乙 9qbZT068 乙 9SZT068 乙:nsDdT06 8 乙 9sfrZT0A-Tt-Tffi-T-t- TK=T1-T 耿=Y=T=TK-Y-rz=T=yt-T-T&- -T敗三=r 號(hào)一號(hào)_墓號(hào)號(hào)一號(hào)號(hào)一號(hào)蚤建曽V號(hào)曹號(hào)號(hào)普曹號(hào)一 TrlrrTrTTTTTTTrTrrrrrTrTrTrTkTTTTrTrL*kTTTrTTTTTrrrTrkTTrTrTT 品品品品品品品品品品品品品品品品品品品品品品晶品品晶品品品品品品口W陽品品品品品品品品口#5玉韋#7rs5卄#-#并弔4FTF#7f# 乙 & 乙 TdTzlzTfoTKSNtoTboxboIzreo 工乙 LZTboTZTZTET 乙 LZXZIZ 吋品品品品品品品品口gona品品晶品
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度2025年門面房租賃與社區(qū)配套服務(wù)合同
- 二零二五年度精裝修公寓房購買與戶外休閑設(shè)施使用合同3篇
- 二零二五版奶粉生產(chǎn)廢棄物資源化利用服務(wù)合同范本頁22篇
- 2025年度影視基地場(chǎng)地租賃合同及影視制作服務(wù)協(xié)議3篇
- 二零二五版電子商務(wù)SET協(xié)議安全風(fēng)險(xiǎn)評(píng)估與風(fēng)險(xiǎn)控制合同3篇
- 二零二五版淋浴房市場(chǎng)推廣與廣告投放合同3篇
- 二零二五年度EPS線條綠色建材采購合同3篇
- 二零二五版水電系統(tǒng)自動(dòng)化改造與升級(jí)合同3篇
- 桶裝水供應(yīng)商與學(xué)校2025年度供需合同3篇
- 惠州2025年法務(wù)專員招聘與法律顧問及合規(guī)審查合同3篇
- 城市基礎(chǔ)設(shè)施維修計(jì)劃
- 2024山西廣播電視臺(tái)招聘專業(yè)技術(shù)崗位編制人員20人歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 新材料行業(yè)系列深度報(bào)告一:新材料行業(yè)研究框架
- 人教版小學(xué)英語各冊(cè)單詞表(帶英標(biāo))
- 廣東省潮州市潮安區(qū)2023-2024學(xué)年六年級(jí)上學(xué)期期末考試數(shù)學(xué)試題
- 鄉(xiāng)村治理中正式制度與非正式制度的關(guān)系解析
- 智能護(hù)理:人工智能助力的醫(yī)療創(chuàng)新
- 國家中小學(xué)智慧教育平臺(tái)培訓(xùn)專題講座
- 5G+教育5G技術(shù)在智慧校園教育專網(wǎng)系統(tǒng)的應(yīng)用
- VI設(shè)計(jì)輔助圖形設(shè)計(jì)
- 淺談小學(xué)勞動(dòng)教育的開展與探究 論文
評(píng)論
0/150
提交評(píng)論