資源描述:
《互斥工具-軟件方式》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、Part1軟件互斥Dekker算法1booleanflag[2];2intturn;3voidP0()4{5while(true)6{7flag[0]=true;8while(flag[1])9if(turn==1)10{11flag[0]=false;12while(turn==1)13/*什么也不做*/14flag[0]=true;15}16臨界區(qū)17turn=1;18flag[0]=false;19其余部分20}21}Peterson算法1booleanflag[2]={false,false};2intturn;
2、3voidP0()4{5while(true)6{7flag[0]=true;8turn=1;9while(flag[1]&&turn==1)10/*什么也不做*/;11臨界區(qū)12flag[0]=false;13/*其余部分*/;14}15}16voidP1()17{18while(true)19{20flag[1]=true;21turn=0;22while(flag[0]&&turn==0)23/*什么也不做*/;24臨界區(qū)25flag[1]=false;26/*其余部分*/;27}28}Part2硬件互斥Tests
3、et指令1booleantestset(inti)/*實現(xiàn)何種功能*/2{3if(i==0)4{5i=16returntrue7}8else9returnfalse10}11constintn=/*進(jìn)程*/12intboltbolt=0testset(bolt)=truebolt=1進(jìn)入臨界區(qū)此時標(biāo)志位bolt=1當(dāng)占用資源結(jié)束bolt=0允許其它進(jìn)程占有臨界資源13voidP(inti)14{15while(1)16{17while(!testset(bolt))18/*什么也不做*/;19臨界區(qū)20bolt=021/
4、*其余部分*/;22}23}24Voidmain()25{26bolt=027parbegin(P(1),P(2),…,P(n));28}exchange指令1voidexchange(intregister,intmemory)/*實現(xiàn)何種功能*/2{3inttemp4temp=memory5memory=register6register=temp7}8constintn=/*進(jìn)程*/9intbolt10voidP(inti)11{進(jìn)程1:keyi=1bolt=0(資源未被占用)通過17行程序:exchange(ke
5、yi,bolt)keyi=0bolt=1(資源已被占用)進(jìn)程2:keyi=1bolt=1通過17行程序:exchange(keyi,bolt)keyi=1bolt=1等待bolt=0才可以占用資源12intkeyi13while(1)14{15keyi=116while(keyi!=0)17exchange(keyi,bolt)18臨界區(qū)19exchange(keyi,bolt)20/*其余部分*/;21}22}23voidmain()24{25bolt=026parbegin(P(1),P(2),…,P(n))27}P
6、(Wait)操作/*申請一個資源*/1P(S)2{3S--4ifS<05block()6}V(Signal)操作/*釋放一個資源*/7V(S)8{9S++10ifS<=011wakeup()12}P(S)臨界區(qū)V(S)輸入進(jìn)程P1P(S1)讀信息到緩沖區(qū)BV(S2)輸出進(jìn)程P2P(S2)從緩沖區(qū)B讀出信息V(S1)如何設(shè)置S1,S2的初值,才能保證進(jìn)程P1,P2同步進(jìn)行?生產(chǎn)者消費者問題1semaphoremutex=1,empty=n,full=02inti=j=03itembuffer[n]4voidproducer
7、()5{6while(1)7{8producenextproduct9P(empty)10P(mutex)11buffer[i]=product12i=i+1%n13V(mutex)14V(full)15}16}17voidconsumer()18{19while(1)20{21P(full)22P(mutex)23product=buffer[j]24j=(j+1)%n25V(mutex)26V(empty)27consumetheproduct28}29}30voidmain()31{32parbegin(produ
8、cer(),consumer())33}讀者寫者問題(見PPT)哲學(xué)家進(jìn)餐問題Originalprocessing:#defineN51voidphilosopher(inti)2{3while(true)4{5thinking6takefork[i]7takefork[(i+1)%5]8eating9putdown