C#Monitor.Wait()是否遭受虚假唤醒?
Java的Object.wait()警告“虚假唤醒”,但C#的Monitor.wait()似乎没有提到它。
看到Mono是如何在Linux上实现的,而Linux有虚假的唤醒 ,这不应该logging在某处吗?
Joe Duffy的“Windows上的并行编程”提到了这一点(P311-312,P598)。 这一点很有趣:
请注意,在上面的所有例子中,线程必须对所谓的虚假唤醒有所回应 – 即使在过早唤醒的情况下,也就是说,在寻找条件之前,使用条件variables的代码应该保持正确和生动成立。 这并不是因为实现实际上会做这样的事情(尽pipe在Java和Pthread等其他平台上的一些实现已经知道这么做),也不是因为代码在不必要的时候有意识地唤醒线程,而是因为没有保证当一个被唤醒的线程将被安排。 条件variables不公平。 有可能 – 甚至有可能 – 另一个线程将获得关联的锁,并在被唤醒的线程有机会重新获取锁并返回关键区域之前使条件再次成为假。
然后,他给出了一个正常的模式一段时间循环testing条件。
我可以这样说,有理由期望Monitor.Wait
通常不会过早地唤醒你,而且如果你完全知道没有别的东西可以改变条件,那么你也许可以在没有条件循环的情况下离开:但是无论如何,包括它是安全的,以防万一你的逻辑不准确。