虚假唤醒和安全性



互斥时,要满足安全性和进步性。但是,如果我们有一个伪唤醒安全性能是否仍然满足?

如果您的系统具有允许虚假唤醒的锁语义,那么程序员必须相应地处理它们。每次醒来,检查它是真的还是假的。这个信息可以由等待函数返回,或者程序可以只检查期望的事件是否发生(例如,我们是否持有我们等待的互斥锁)。如果是,可以安全进入临界区。如果没有,那就回去睡觉,或者做一些其他的工作。

所以保护临界区的伪代码应该是这样的:

Mutex m;
void do_critical_stuff() {
while (true) {
m.wait();
if (m.held()) {
critical_code();
m.unlock();
return;
} else {
// No critical code allowed here, but you could do something else.
print("You have waked me too soon, I must slumber again.");
}
}
}