資源描述:
《線程同步機(jī)制實(shí)驗(yàn)報(bào)告》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、線程同步機(jī)制實(shí)驗(yàn)報(bào)告、實(shí)驗(yàn)?zāi)康?通過(guò)觀察共享數(shù)據(jù)資源但不受控制的兩個(gè)線程的并發(fā)運(yùn)行輸出結(jié)果,體會(huì)同步機(jī)制的必要性和重要性。然后利用現(xiàn)有操作系統(tǒng)提供的同步機(jī)制編程實(shí)現(xiàn)關(guān)于該兩個(gè)線程的冇序控制,同時(shí)要求根據(jù)同步機(jī)制的Peterson軟件解決方案嘗試口己編程實(shí)現(xiàn)同步機(jī)制和用于同一問題的解決,并基于程序運(yùn)行時(shí)間長(zhǎng)短比較兩種同步機(jī)制。二、實(shí)驗(yàn)內(nèi)容:1、基于給定銀行賬戶間轉(zhuǎn)賬操作模擬代碼作為線程執(zhí)行代碼,在主線程中創(chuàng)建兩個(gè)并發(fā)線程,編程實(shí)現(xiàn)并觀察程序運(yùn)行結(jié)杲和予以解釋說(shuō)明。(無(wú)同步機(jī)制)2、利用Win32API中互斥信
2、號(hào)量操作函數(shù)解決上述線程并發(fā)問題,并分析、嘗試和討論線程執(zhí)行體屮有關(guān)信號(hào)量操作函數(shù)調(diào)用的正確位置。3、根據(jù)同步機(jī)制的Peterson軟件解決方案嘗試自己編程實(shí)現(xiàn)線程同步機(jī)制和用于上述線程并發(fā)問題的解決,并基于程序運(yùn)行時(shí)間長(zhǎng)短將其與基于Win32API互斥信號(hào)量的線程同步機(jī)制的效率展開比較。其間,可規(guī)定線程主體代碼循環(huán)執(zhí)行1000000次。三、實(shí)驗(yàn)環(huán)境:操作系統(tǒng):Windows7軟件:VC++6.0實(shí)驗(yàn)設(shè)計(jì):?本實(shí)驗(yàn)包含三個(gè)基于并發(fā)線程的程序,第一個(gè)沒有同步機(jī)制,第二個(gè)利用Win32API中互斥信號(hào)量操作函數(shù)
3、解決線程并發(fā)問題,第三個(gè)根據(jù)同步機(jī)制的Peterson軟件解決方案實(shí)現(xiàn)線程同步機(jī)制并解決線程并發(fā)問題。三個(gè)程序擁有相同的線程主體:線程主體設(shè)計(jì):do{nTemp1=nAccountl;nTemp2=nAccount2;nRandom二rand();nAccountl=nTemp1+nRandom;nAccount2=nTemp2-nRandom;nLoop++;}while((nAccountl+nAccount2)==0);該線程主體是對(duì)銀行賬戶間轉(zhuǎn)賬操作模擬的模擬,可知,若并發(fā)的線程不發(fā)生交叉,則依次轉(zhuǎn)
4、賬操作JiunAccountl+nAccount2的值永遠(yuǎn)為0,程序不會(huì)跳出循環(huán),如果線程發(fā)生交叉,則經(jīng)過(guò)若干次轉(zhuǎn)賬操作后,就有可能出現(xiàn)nAccountl+nAccount2不為0的情況,此時(shí)程序跳出循環(huán)。木實(shí)驗(yàn)的三個(gè)程序就是基于此線程主體逐步實(shí)現(xiàn)的。?同步機(jī)制的Peterson軟件解決方案Peterson進(jìn)程互斥算法4一編號(hào)+標(biāo)志軟身譬決Varflagyfla%:boolean;turn:integer;repeatflagj:=true;turn:=j;while(fl喝andturn=j)do臨界區(qū)f
5、lagj:=false;untilfalse;2014年』月24日星期四北京交通大學(xué)計(jì)算機(jī)學(xué)院27……Pjflagj:=true;turn:=i;while(flagjandturn=i)doD:Q二Q、P;臨界反flagj:=false;五、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):?程序一:沒有同步機(jī)制xctbclasses-'_JGlobals&mainQQThreadFunc(HANDLEThread)DnAccountlDnAccount2QnLoopDnRandomQnTemp!QnTemp2intmain(){HANDL
6、EThread[2J;說(shuō)明:ThreadFunc(HANDLEThread)為線程兩數(shù);nAccountKaAccount2模擬賬戶;nLoop記錄循環(huán)次數(shù);nRandom是產(chǎn)生的隨機(jī)數(shù)模擬傳賬金額;nTemp1、nTemp2用于暫存nAccountlsaAccount2;HANDLEThread⑵創(chuàng)建兩個(gè)線程句柄。?程序二:利用Win32API中互斥信號(hào)量-xctblclassesErPjGlobals&mainQQThreadFuncfLPVOIDIpParamter)QmutexQnAccountlQ
7、nAccount2$nLoopQnRandom$nTemp!9nTemp2intmain()longtine;HANDLEThread[2];DWORDtine_start,tine_end;說(shuō)明:mutex為互斥信號(hào)量;time_start>time_end為線程開始運(yùn)彳亍和結(jié)束的時(shí)間;time=time_end-time_starto?程序三:同步機(jī)制的Peterson軟件解決方案classes-tSGIobals&mainQ&ThreadFuncOJHANDLEThread)&ThreadFuncl(
8、HANDLEThread)9flag/mutex/nAccount!/nAccount2/nLoop!/nLoop2/nRandom(/nTemp!QnTemp2Qturnintmain(){longtime;HANDLEThread[2];DWORDtine_start,tine_end;說(shuō)明:flag為長(zhǎng)度為2的bool型藪組,turn為整型,flag與turn共同實(shí)現(xiàn)同步機(jī)制的Peterson軟件解決方案;