Thread.SpinWait 方法和Spin结构

 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 方法。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值