Java的 Object.wait() 警告存在“虚假唤醒”,但是C#的 Monitor.wait() 似乎根本没有提到它。
考虑到Mono是在Linux之上实现的,而Linux存在虚假唤醒,这不应该在某个地方进行记录吗?
Java的 Object.wait() 警告存在“虚假唤醒”,但是C#的 Monitor.wait() 似乎根本没有提到它。
考虑到Mono是在Linux之上实现的,而Linux存在虚假唤醒,这不应该在某个地方进行记录吗?
Joe Duffy的Windows并发编程提到了这一点(P311-312,P598)。这段话很有趣:
请注意,在上述所有示例中,线程必须对所谓的虚假唤醒具有弹性-使用条件变量的代码应在即使在被过早唤醒(即在寻找的条件已经建立之前)的情况下仍保持正确和活跃。这不是因为实现实际上会做这些事情(尽管其他平台(如Java和Pthreads)上的某些实现已知会这样做),也不是因为代码将在不必要时有意地唤醒线程,而是由于没有关于何时唤醒已被唤醒的线程将被调度的保证。条件变量不公平。可能-甚至很可能-另一个线程将获取相关锁并再次使条件为false,然后唤醒线程没有机会重新获取锁并返回临界区。
然后他给出了测试条件的while循环的正常模式。
我认为从这个可以合理地预期Monitor.Wait
通常不会让您过早地醒来,并且如果您绝对知道没有其他东西可以更改条件,那么您可能可以不包括条件循环:但是为了安全起见,最好还是包括它,以防逻辑不准确。