SpinWait 方法在实现锁定方面十分有用。 .NET Framework 中的类(例如 Monitor 和 ReaderWriterLock)在内部使用此方法。 SpinWait 实质上会将处理器置于十分紧密的循环中,其循环计数由 iterations 参数指定。 因此,等待的持续时间取决于处理器的速度。

针对这一点,将此方法与 Sleep 方法进行对比。 调用 Sleep 的线程会产生其处理器时间当前片断的剩余部分,即使指定的时间间隔为零也不例外。 如果为 Sleep 指定非零的时间间隔,则线程计划程序会不考虑该线程,直到该时间间隔结束。

SpinWait 并不广泛适用于普通应用程序。 在大多数情况下,应使用 .NET Framework 提供的同步类;例如,调用 Monitor.Enter 或包装 Monitor.Enter 的语句(在 C# 中为 lock,在 Visual Basic 中为 SyncLock)。

警告说明 警告

在避免上下文切换可带来益处的极少数情况下(例如,当已知即将发生状态更改时),应在循环中调用 SpinWait 方法。 SpinWait 执行的代码旨在防止可能在多处理器计算机上发生的问题。 例如,在具有多个采用 Hyper-Threading™ 技术的 Intel™ 处理器的计算机上,SpinWait 可防止在某些情况下出现处理器占用不足的现象。

SpinWait 结构

.NET Framework 4
 

 

提供对基于自旋的等待的支持

SpinWait 封装常见旋转逻辑。 在单处理器计算机上,始终使用“生成”而不是“繁忙等待",在使用 Intel™ 处理器(采用超线程技术)的计算机上,它有助于防止硬件线程出现资源不足。 SpinWait 封装旋转与真正生成的良好混合。

SpinWait 是一种值类型,这意味着低级别代码可以利用 SpinWait 而不用担心不必要的分配开销。 SpinWait 并不广泛适用于普通应用程序。 在大多数情况下,应使用 .NET Framework 提供的同步类,如 Monitor 在需要旋转等待的大多数情况下,SpinWait 类型应该优于 SpinWait 方法。

 























本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/543021 ,如需转载请自行联系原作者