小编典典

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

java

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

了解Mono是如何在Linux之上实现的,并且Linux具有虚假的唤醒功能,难道不应该在某个地方对此进行记录吗?


阅读 312

收藏
2020-09-28

共1个答案

小编典典

Joe Duffy的“Windows并行编程”中提到了这一点(P311-312,P598)。这一点很有趣:

请注意,在以上所有示例中,线程必须对所谓的虚假唤醒具有弹性-
使用条件变量的代码即使在过早唤醒(即在查找条件之前)也应保持正确和生动。成立。这不是因为该实现实际上会执行此类操作(尽管已知其他平台(例如Java和Pthreads)上的某些实现也可以这样做),也不是因为在不需要时代码会有意地唤醒线程,而是因为没有这样的事实。确保已唤醒线程的调度时间。条件变量不公平。它’

然后,他给出正常模式,进行一会儿循环测试条件。

我要说的是,可以合理地预期通常Monitor.Wait 不会 过早地唤醒您,并且,如果您绝对 知道 没有其他事情可以改变条件,那么您 可以
在没有条件循环的情况下摆脱困境:但是这样做更安全包括它,以防万一您的逻辑不正确。

2020-09-28