我在使用信號量進行進程同步時遇到了困難。基本上,我沒有看到中斷會如何破壞程序,並構建場景來解決問題。下面是我堅持了幾天的一個問題。請幫忙。提前致謝!關於使用信號量進行線程同步的示例
描述:「H2O」問題。
hReady()和oReady()函數「生成」H和O.每個H線程和O線程執行hReady()和oReady()。準備完成兩個H和一個O後,其中一個程序必須調用makewater()。解決方案應避免飢餓和忙碌等待。還假設線程喚醒的FIFO策略。
方法1:這種方法的任何問題? (答案是肯定的,我能理解爲什麼。)
int numHydrogen = 0;
sema_t pairOfHydrogen = 0;
sema_t oxygen = 0;
void hReady() {
numHydrogen ++; // I'm assuming here should have a mutex
if ((numHydrogen % 2) == 0) {
signal(pairOfHydrogen);
}
wait(oxygen);
}
void oReady() {
wait(pairOfHydrogen);
makeWater();
signal(oxygen);
signal(oxygen);
}
方法2:有什麼問題嗎? (答案是肯定的,但我不明白爲什麼還有如何構建一個特定的場景。?)
sema_t hPresent = 0;
sema_t waitForWater = 0;
void hReady() {
signal(hPresent);
wait(waitForWater);
}
void oReady() {
wait(hPresent); // It seems something wrong here. I'm not sure why
wait(hPresent); // Also here. Why?
makeWater();
signal(waitForWater);
signal(waitForWater);
}
方法3:在方法2.任何問題假設LIFO線程喚醒窗口? (也是,但是爲什麼呢?在這個問題中,喚醒策略是如何發揮作用的?)
有沒有什麼簡單的方法可以解決類似的問題?應該怎麼考慮構建場景?再次感謝您的幫助!
你有什麼問題?另外,你的方法#2是可怕的錯誤。一個人不應該連續兩次等待信號量。這是一個死鎖的可愛牀。 –
我未能構建場景來描述潛在的問題。特別是在方法2和3中,線程喚醒策略如何影響?在我看來,O線始終可以找到2 H來製造水。 – Yuki
你能否展示更多你的代碼?我沒有看到你是如何開始線程和在哪裏。它們很重要,我感覺到僵局。 –