Monitor.Wait()是否仍然调用上下文切换?

时间:2014-03-15 21:52:02

标签: c# .net multithreading

如果我Wait Pulse来自Monitor.Wait(),如下例所示,系统是否仍会安排等待线程(包括上下文切换)并在产生之前检查条件时间片?

或者线程没有再次安排,并且“唤醒”#39;当另一个线程调用Monitor.Pulse()

时内核
Monitor.Enter(LOCK_OBJ);
Monitor.Wait(LOCK_OBJ);
Monitor.Exit(LOCK_OBJ);

我问的原因是,我希望在线程等待很长时间时不必要地避免上下文切换。基本上,我想休眠'线程。

1 个答案:

答案 0 :(得分:0)

When exactly .NET Monitor goes to kernel-mode?中详细讨论了Monitor.Wait实施。

如果锁定时间很短并且内核模式的成本等待并且上下文切换太高,那么您应该考虑使用 spinlock 。螺旋锁繁忙循环试图获取锁,而不是让CPU产生。专家认为它永远不会产生上下文切换的开销。 con是它使CPU保持忙碌。

对于高性能游戏引擎,其中有一些共享数据被非常短暂地锁定,螺旋锁是正确的使用方法。