我很难与信号量进行进程同步。基本上,我没有看到中断如何破坏程序,并构建方案来解决问题。以下是我困住了几天的问题。请帮忙。提前谢谢!
描述:“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。有任何问题吗? (也是的。但是为什么?在这个问题中如何唤醒政策?)
有没有简单的方法来解决类似的问题?如何构建场景?再次感谢您的帮助!
答案 0 :(得分:1)
方法1
场景:hReady
在oReady
之前启动。
hReady
帖子中发生了什么:
oReady
帖子中发生了什么:
所以你的2个演员被封锁,因为hReady
只产生一个H而不是2,等待一个永远不会来的O(因为他也在等待)。
另外,正如您所注意到的,numHydrogen
可能需要R / W保护。
方法2
几乎相同的情况:当您启动hReady
时,您会被waitForWater
屏蔽。
oReady
中的第一次等待已解锁但第二次等待将永远持续,因为您没有发出waitForWater
虽然我不理解方法3