生產(chǎn)者—消費(fèi)者問題(互斥蜜唾、同步)
信號(hào)量
producer :
repeat
…
produce an item in nexp;
wait(empty);
wait(mutex);
buffer(in):=nexp;
in:=(in+1) mod n;
signal(mutex);
signal(full);
until? false;
consumer :
repeat
wait(full);
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);
consume the item in nexc;? ? ? ? ? ? ? ? ? ? ? ?
until? false;?
AND信號(hào)量的方式
consumer :
? ? repeat
? ? nextc:=buffer(out);
? ? out:=(out+1) mod n;
? ? consume the item in nexc;
until? false;
哲學(xué)家就餐問題(互斥)(可見:相鄰兩位不能同時(shí)進(jìn)餐;最多只能有兩人同時(shí)進(jìn)餐悔捶。 )
記錄型信號(hào)量
(1)第i 位哲學(xué)家的活動(dòng)可描述為:
repeat
? ? ? ? ? wait(chopstick[ i ]);
? ? ? ? ? wait(chopstick[ ( i +1) mod 5] );
? ? …
? ? eat;
? ? …
? ? ? ? ? signal(chopstick[ i ]);
? ? ? ? ? signal(chopstick[ ( i +1) mod 5] );
? ? …
? ? think;
until? false;
2)就餐死鎖問題(數(shù)量控制)
一刀切:僅當(dāng)哲學(xué)家的左右兩只筷子均可用時(shí)墩蔓,才允許他拿起筷子進(jìn)餐。
AND信號(hào)量
Var chopstick: array [0, …, 4] of semaphore:=(1, 1, 1, 1, 1);
Process i
? ? repeat
? ? ? ? think;
? ? ? ? Swait(chopstick[ ( i +1) mod 5] , chopstick[ i ] );
? ? ? ? eat;
? ? ? ? Ssignal(chopstick[ ( i +1) mod 5] , chopstick[ i ] );? ?
? ? until? false;
讀者——寫者問題(有條件的互斥)
合理的同步關(guān)系是:
多個(gè)讀進(jìn)程可同時(shí)讀精盅;
Writer進(jìn)程與任何其他進(jìn)程(包括Reader進(jìn)程或其他Writer進(jìn)程)不允許同時(shí)訪問文件宏胯。