我在使用信号量进行进程同步时遇到了困难。基本上,我没有看到中断会如何破坏程序,并构建场景来解决问题。下面是我坚持了几天的一个问题。请帮忙。提前致谢!关于使用信号量进行线程同步的示例
描述:“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
你能否展示更多你的代码?我没有看到你是如何开始线程和在哪里。它们很重要,我感觉到僵局。 –