如果我Wait
Pulse
来自Monitor.Wait()
,如下例所示,系统是否仍会安排等待线程(包括上下文切换)并在产生之前检查条件时间片?
或者线程没有再次安排,并且“唤醒”#39;当另一个线程调用Monitor.Pulse()
?
Monitor.Enter(LOCK_OBJ);
Monitor.Wait(LOCK_OBJ);
Monitor.Exit(LOCK_OBJ);
我问的原因是,我希望在线程等待很长时间时不必要地避免上下文切换。基本上,我想休眠'线程。
答案 0 :(得分:0)
在When exactly .NET Monitor goes to kernel-mode?中详细讨论了Monitor.Wait
实施。
如果锁定时间很短并且内核模式的成本等待并且上下文切换太高,那么您应该考虑使用 spinlock 。螺旋锁繁忙循环试图获取锁,而不是让CPU产生。专家认为它永远不会产生上下文切换的开销。 con是它使CPU保持忙碌。
对于高性能游戏引擎,其中有一些共享数据被非常短暂地锁定,螺旋锁是正确的使用方法。