題目:
桌上有個(gè)能剩得下五個(gè)水果的空盤子。爸爸不停地向盤中放蘋果和桔子,兒子不停地從盤中取出桔子享用,女兒不停地從盤中取出蘋果享用。規(guī)定三人不能同時(shí)從盤子中取放水果。試用信號(hào)量實(shí)現(xiàn)爸爸、兒子和女兒這三個(gè)循環(huán)進(jìn)程之間的同步(來源:《計(jì)算機(jī)操作系統(tǒng)學(xué)習(xí)指導(dǎo)與題解》)。
學(xué)過生產(chǎn)者-消費(fèi)者的你應(yīng)該能立刻看出此題其實(shí)是生產(chǎn)者-消費(fèi)者的變形。
生產(chǎn)者是父親,能生產(chǎn)出兩種產(chǎn)品;消費(fèi)者是兒子和女兒(一個(gè)消費(fèi)桔子,一個(gè)消費(fèi)蘋果)。
有五個(gè)空盤子,相當(dāng)于有五個(gè)緩沖池。
設(shè)置信號(hào)量semaphore empty = 5, orange = 0, apple = 0, mutex = 1;(初始5個(gè)盤子都為空,兒子和女兒都沒拿到水果,三人不能同時(shí)操作,意味著只有一個(gè)臨界資源。)
Dad() {
while (1) {
wait(empty);//如果先申請(qǐng)臨界資源再申請(qǐng)空盤子,則可能出現(xiàn)申請(qǐng)臨界資源成功卻因?yàn)樯暾?qǐng)空盤子失敗而阻塞,結(jié)果后面的進(jìn)程想申請(qǐng)臨界資源卻無法申請(qǐng)而阻塞,造成連鎖反應(yīng);
wait(mutex);
將水果放入盤中;
signal(mutex);
if (放入的是桔子) {
signal(orange);
}
else signal(apple);
}
}
Son() {
while (1) {
wait(orange);
wait(mutex);
從盤中取一個(gè)桔子;
signal(mutex);
signal(empty);
享用桔子;
}
}
Daughter() {
while (1) {
wait(apple);
wait(mutex);
從盤中取一個(gè)蘋果;
signal(mutex);
signal(empty);
享用蘋果;
}
}