【问题标题】:SpinLock and readonly fields自旋锁和只读字段
【发布时间】:2012-02-10 21:16:18
【问题描述】:

刚刚阅读MSDN page关于新.NET 4.0功能SpinLock的内容,无法理解以下语句背后的想法:

不要将 SpinLock 实例存储在只读字段中。

我的感觉是这与价值类型的细节有某种关系,但不确定具体如何以及为什么。有人能更清楚地说明这一点吗?

【问题讨论】:

  • @Chriseyre2000 :为什么你删除了你的答案?这很好,但质量非常低我相信这就是为什么有人反对它。只需提供更多详细信息并取消删除,无论如何我都会 +1,因为您是第一个回答的人。谢谢!我真的忽略了你提到的 MSDN 页面评论

标签: c# .net multithreading c#-4.0 .net-4.0


【解决方案1】:

根本问题是,当您在其上调用非静态方法并在副本上执行该方法时,C# 编译器会创建一个 readonly 值类型字段的副本 - 因为该方法可以 具有改变结构值的副作用 - readonly 字段不允许这样做。

如需进一步说明,请参阅"Mutating Readonly Structs"

【讨论】:

  • 毛。我很难相信他们会如此鲁莽地将可变对象变成结构,更不用说像锁一样重要了。
  • +1 谢谢,好东西!让我感到羞耻的是我以前不知道可变只读结构。
  • @JonathanAllen SpinLock 是一个最轻量级的锁对象。它适用于高级用例。
  • @sll SpinLock 的全部目的是实例方法调用改变结构。具体来说,当您执行mySpinLock.Enter(ref wasLockSuccessful); 时,方法调用会更改mySpinLock 的状态。现在,如果mySpinLock 是用readonly 声明的字段,则它是被更改的字段的副本 的状态。布尔 wasLockSuccessful 设置为 true。但是,当您检查原件(而不是未保存的副本)mySpinLock 时,mySpinLock.IsHeld 仍然是 false。删除 readonly 修饰符可以解决这个问题。
  • 四年过去了,我没有改变我的看法。仅当您期望有人创建数千个自旋锁时,才将其作为支柱是合理的,而且我只是不认为会发生这种情况。
猜你喜欢
  • 2015-01-24
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多