版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、線程同步機(jī)制實(shí)驗(yàn)報告一、 實(shí)驗(yàn)?zāi)康模和ㄟ^觀察共享數(shù)據(jù)資源但不受控制的兩個線程的并發(fā)運(yùn)行輸出結(jié)果, 體會同步機(jī)制的必要性和重要性。 然后利用現(xiàn)有操作系統(tǒng)提供的同步機(jī)制編程實(shí)現(xiàn)關(guān)于該兩個線程的有序控制,同時要求根據(jù)同步機(jī)制的 Peterson 軟件解決方案嘗試自己編程實(shí)現(xiàn)同步機(jī)制和用于同一問題的解決, 并基于程序運(yùn)行時間長短比較兩種同步機(jī)制。二、實(shí)驗(yàn)容:1、基于給定銀行賬戶間轉(zhuǎn)賬操作模擬代碼作為線程執(zhí)行代碼,在主線程中創(chuàng)建兩個并發(fā)線程,編程實(shí)現(xiàn)并觀察程序運(yùn)行結(jié)果和予以解釋說明。同步機(jī)制)(無2、利用 Win32 API 中互斥信號量操作函數(shù)解決上述線程并發(fā)問題,并分析、嘗試和討論線程執(zhí)行體中有關(guān)信
2、號量操作函數(shù)調(diào)用的正確位置。3、根據(jù)同步機(jī)制的Peterson 軟件解決方案嘗試自己編程實(shí)現(xiàn)線程同步機(jī)制和用于上述線程并發(fā)問題的解決,并基于程序運(yùn)行時間長短將其與基于 Win32 API 互斥信號量的線程同步機(jī)制的效率展開比較。 其間,可規(guī)定線程主體代碼循環(huán)執(zhí)行 1000000 次。三、實(shí)驗(yàn)環(huán)境:操作系統(tǒng): Windows 7軟件:VC+6.0四、實(shí)驗(yàn)設(shè)計:本實(shí)驗(yàn)包含三個基于并發(fā)線程的程序,第一個沒有同步機(jī)制,第二個利用 Win32 API 中互斥信號量操作函數(shù)解決線程并發(fā)問題,第三個根據(jù)同步機(jī)制的 Peterson 軟件解決方案實(shí)現(xiàn)線程同步機(jī)制并解決線程并發(fā)問題。三個程序擁有相同的線程主體
3、:線程主體設(shè)計:donTemp1 = nAccount1;nTemp2 = nAccount2;nRandom = rand();nAccount1 = nTemp1 + nRandom;nAccount2 = nTemp2 - nRandom;nLoop+; while (nAccount1 + nAccount2)=0);該線程主體是對銀行賬戶間轉(zhuǎn)賬操作模擬的模擬,可知,若并發(fā)的線程不發(fā)生交叉, 則依次轉(zhuǎn)賬操作后nAccount1 + nAccount2 的值永遠(yuǎn)為0,程序不會跳出循環(huán),如果線程發(fā)生交叉,則經(jīng)過若干次轉(zhuǎn)賬操作后,就有可能出現(xiàn) nAccount1 + nAccount2 不為
4、 0 的情況,此時程序跳出循環(huán)。本實(shí)驗(yàn)的三個程序就是基于此線程主體逐步實(shí)現(xiàn)的。同步機(jī)制的 Peterson軟件解決方案五、數(shù)據(jù)結(jié)構(gòu)設(shè)計:程序一:沒有同步機(jī)制說明: ThreadFunc(HANDLE Thread)為線程函數(shù);nAccount1、aAccount2 模擬賬戶; nLoop 記錄循環(huán)次數(shù); nRandom 是產(chǎn)生的隨機(jī)數(shù)模擬轉(zhuǎn)賬金額; nTemp1、nTemp2 用于暫存 nAccount1、aAccount2;HANDLE Thread2創(chuàng)建兩個線程句柄。程序二:利用 Win32 API 中互斥信號量說明:mutex 為互斥信號量; time_start、time_end 為線
5、程開始運(yùn)行和結(jié)束的時間; time=time_end- time_start。程序三:同步機(jī)制的Peterson軟件解決方案說明: flag 為長度為 2 的 bool 型數(shù)組, turn 為整型, flag 與 turn 共同實(shí)現(xiàn)同步機(jī)制的 Peterson軟件解決方案; nLoop1 記錄線程 0 的循環(huán)次數(shù); nLoop 記錄線程 1 的循環(huán)次數(shù)。六、算法流程圖:程序一:沒有同步機(jī)制開始創(chuàng)建兩個線程線程 1轉(zhuǎn)賬線程 2轉(zhuǎn)賬NnAccount1 +NnAccount2=0Y輸出循環(huán)次數(shù)結(jié)束程序二:利用 Win32 API 中互斥信號量開始創(chuàng)建兩個線程線程1線程 2等待資源等待資源WaitF
6、orSingleObject(muteWaitForSingleObject(mutex,INFINITE);x,INFINITE);轉(zhuǎn)賬轉(zhuǎn)賬nLoop+;nLoop+;釋放資源釋放資源NNnLoop<1000000Y輸出循環(huán)次數(shù)結(jié)束程序三:同步機(jī)制的Peterson軟件解決方案開始創(chuàng)建兩個線程線程1線程2等待資源等待資源flag0=true; turn=1;flag0=true; turn=1;while(flag1 &&while(flag1 &&turn=1)turn=1)轉(zhuǎn)賬轉(zhuǎn)賬nLoop1+;nLoop2+;釋放資源釋放資源NNnLoop1+nL
7、oop2<1000000Y輸出循環(huán)次數(shù)結(jié)束七、實(shí)驗(yàn)過程結(jié)果截圖:程序一:沒有同步機(jī)制程序二:利用 Win32 API 中互斥信號量程序三:同步機(jī)制的Peterson軟件解決方案八、實(shí)驗(yàn)結(jié)果分析:第一個程序 兩個線程并發(fā)并沒有同步機(jī)制,所以產(chǎn)生了 nAccount1 + nAccount2 不為 0 的情況,程序跳出循環(huán),一個線程結(jié)束,但剩余的一個線程自己是無法跳出循環(huán)的,所以程序一直在運(yùn)行;第二個程序利用互斥信號并通過成功資源資源來解決并發(fā)帶來的混亂;第三個程序通過同步機(jī)制的 Peterson 軟件解決方案解決并發(fā)帶來的混亂;通過結(jié)果可知,同步機(jī)制的Peterson軟件解決方案的效率要高
8、于利用 Win32 API 中互斥信號量的方法。九、實(shí)驗(yàn)總結(jié):實(shí)驗(yàn)心得:通過本次實(shí)驗(yàn),我鍛煉里自己的編程能力,并對理論知識有了進(jìn)一步的理解。對線程并發(fā)問題有了進(jìn)一步的體會, 并掌握了同步線程的方法,特別是同步機(jī)制的 Peterson 軟件解決方案。同時我也體會到,學(xué)好這門課程,不光要掌握好理論,更重要的是要多實(shí)踐,對實(shí)驗(yàn)現(xiàn)象多加分析研究,才會融會貫通所學(xué)的容。實(shí)驗(yàn)評價:本實(shí)驗(yàn)按照實(shí)驗(yàn)指導(dǎo)書完成了要求的全部容,成功得出了結(jié)果。但實(shí)驗(yàn)程序也存在一些潛在的漏洞, 比如第三個程序在多次執(zhí)行中會出現(xiàn)總的循環(huán)次數(shù)不為 1000000 的情況,有待進(jìn)一步完善。十、實(shí)驗(yàn)程序清單:程序一:沒有同步機(jī)制#incl
9、ude <stdio.h>#include<windows.h>#include<stdlib.h>#include<iostream>using namespace std;int nAccount1=0, nAccount2=0;int nLoop=0;int nTemp1,nTemp2,nRandom;DWORD WINAPI ThreadFunc(HANDLE Thread)donTemp1 = nAccount1;nTemp2 = nAccount2;nRandom = rand();nAccount1 = nTemp1 + nRand
10、om;nAccount2 = nTemp2 - nRandom;nLoop+; while (nAccount1 + nAccount2)=0); printf(" 循環(huán)次數(shù)為 %dn", nLoop); return 0;int main()HANDLE Thread2;Thread0=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);Thread1=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);WaitForMultipleObjects(2,Thread,TRUE,INFINITE);Cl
11、oseHandle(Thread);return 0;程序二:利用Win32 API 中互斥信號量#include <windows.h>#include <stdlib.h>#include <stdio.h>#include<iostream>using namespace std;#define COUNT 1000000int nAccount1 = 0, nAccount2 = 0;int nLoop = 0;int nTemp1, nTemp2, nRandom;HANDLE mutex;DWORD WINAPI ThreadFunc
12、(LPVOID lpParamter)WaitForSingleObject(mutex,INFINITE);donTemp1 = nAccount1;nTemp2 = nAccount2;nRandom = rand();nAccount1 = nTemp1 + nRandom;nAccount2 = nTemp2 - nRandom;nLoop+;ReleaseMutex(mutex);WaitForSingleObject(mutex,INFINITE);while (nAccount1+nAccount2 = 0 && nLoop<COUNT);printf(&q
13、uot; 循環(huán)次數(shù)為 %dn", nLoop);ReleaseMutex(mutex);return 0;int main()long time;HANDLE Thread2;DWORD time_start, time_end;time_start = GetTickCount();mutex = CreateMutex(NULL,FALSE,"screen");Thread0 = CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);Thread1 = CreateThread(NULL,0,ThreadFunc,NULL,0
14、,NULL);WaitForMultipleObjects(2,Thread,TRUE,INFINITE);CloseHandle(Thread);CloseHandle(mutex);time_end = GetTickCount();time=time_end-time_start;cout<<" 總共用時: "<<time<<"ms"<<endl;return 0;程序三:同步機(jī)制的Peterson 軟件解決方案#include <windows.h>#include <stdlib
15、.h>#include<iostream>using namespace std;#define COUNT 1000000int nAccount1=0,nAccount2=0;int nLoop1 = 0;int nLoop2 = 0;int nTemp1=0,nTemp2=0,nRandom;bool flag2;int turn;HANDLE mutex;DWORD WINAPI ThreadFunc0(HANDLE Thread)flag0=true;turn=1;while(flag1 && turn=1)do/這三行是模擬互斥信號量申請nTemp
16、1 = nAccount1;nTemp2 = nAccount2;nRandom = rand();nAccount1 = nTemp1 + nRandom;nAccount2 = nTemp2 - nRandom;nLoop1+;flag0=false;flag0=true;turn=1;while(flag1 && turn=1)/釋放資源/這三行是模擬互斥信號量申請while(nAccount1+nAccount2)=0 && (nLoop1+nLoop2)<COUNT ); cout<<"1 循環(huán)次數(shù)為 :"<
17、<nLoop1<<endl; flag0=false;return 0;DWORD WINAPI ThreadFunc1(HANDLE Thread)flag1=true;turn=0;while(flag0 && turn=0)do/這三行是模擬互斥信號量申請nTemp1=nAccount1;nTemp2=nAccount2;nRandom = rand();nAccount1 = nTemp1 + nRandom;nAccount2 = nTemp2 - nRandom;nLoop2+;flag1=false;flag1=true;turn=0;/ 釋放資
18、源/ 這三行是模擬互斥信號量申請while(flag0 && turn=0)while(nAccount1+nAccount2)=0 && (nLoop1+nLoop2)<COUNT); cout<<"2 循環(huán)次數(shù)為 :"<<nLoop2<<endl; flag1=false;return 0;int main()long time;HANDLE Thread2;DWORD time_start, time_end;time_start = GetTickCount();Thread0 = CreateThread(NULL,0,ThreadFunc0,NULL,0,NULL); Thread1 = CreateThread(NULL,0,ThreadFu
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 防雨雪冰凍應(yīng)急演練
- 頸椎病的預(yù)防與照護(hù)
- 花生酥課件教學(xué)課件
- 零售年中述職報告
- 精神科阿爾茨海默病
- 2.2 課時2 離子反應(yīng) 課件 上學(xué)期化學(xué)魯科版(2019)必修第一冊
- 超市防盜標(biāo)簽的種類和使用方法
- 初中體育教案課后反思
- 角的平分線的性質(zhì)說課稿
- 經(jīng)濟(jì)特區(qū)城市更新與社區(qū)服務(wù)
- 神州十三號飛船知識科普宣傳主題
- 《大學(xué)生創(chuàng)新創(chuàng)業(yè)基礎(chǔ)教程》第六章創(chuàng)業(yè)資源與融資
- 專職會計勞務(wù)合同模板
- 2024年秋新滬教牛津版英語三年級上冊課件 Unit 5 第2課時
- 中圖版七年級下冊信息技術(shù) 2.1規(guī)劃影片任務(wù) 教學(xué)設(shè)計
- 2024中科院心理咨詢師考試復(fù)習(xí)題庫(官方版)-上單選題匯
- GB/T 44421-2024矯形器配置服務(wù)規(guī)范
- DB50-T 771-2017 地下管線探測技術(shù)規(guī)范
- 2024年P(guān)MP項目管理師考試試卷及答案指導(dǎo)
- 憲法是根本法教案-2.憲法是根本法-六年級上冊道德與法治(新版)
- 2024年全國普法知識考試題庫與答案
評論
0/150
提交評論