C#Monitor.Wait()是否遭受虚假唤醒?

时间:2009-09-22 18:48:46

标签: c# java multithreading

Java的Object.wait()警告“虚假的唤醒”,但C#的Monitor.wait()似乎根本没有提到它。

看看Mono是如何在Linux之上实现的,并且Linux有spurious wakeups,不应该在某处记录吗?

1 个答案:

答案 0 :(得分:73)

Joe Duffy的"Concurrent Programming On Windows"提到了这一点(P311-312,P598)。这一点很有意思:

  

请注意,在上述所有示例中,线程必须对称为虚假唤醒的内容具有弹性 - 使用条件变量的代码应该保持正确和生动,即使在它过早被唤醒的情况下,即在条件存在之前寻求已经建立。这不是因为实现实际上会做这样的事情(虽然已知其他平台上的某些实现,比如Java和Pthreads这样做),也不是因为代码会在不必要时故意唤醒线程,而是因为没有保证被唤醒的线程何时被安排。条件变量不公平。有可能 - 甚至可能 - 另一个线程将获取相关的锁并在唤醒的线程有机会重新获取锁并返回关键区域之前再次使条件为假。

然后,他给出了测试条件的while循环的正常模式。

我想说,从这一点来看,有理由期望Monitor.Wait 通常不会过早地叫醒你,并且如果你绝对知道没有别的可以改变条件,然后可能能够在没有条件循环的情况下离开:但是无论如何都包括它更安全,以防你的逻辑不准确。