【问题标题】:Does lock allocate是否分配锁
【发布时间】:2009-11-30 14:41:16
【问题描述】:

我在某处读到,虽然我不记得在哪里,但在 C# 中使用 lock 关键字可以分配。

我知道尝试锁定 ValueType 会使 valuetype 装箱,但还有其他情况吗?

编辑::

  1. 似乎每个人都在回答 valuetype 案例,我已经知道了!
  2. 我也知道什么是锁和 如何深入使用它们, 关于最佳实践的一般建议是 不错 - 但没用;)
  3. 我需要 知道因为我正在构建一个 XNA 应用程序 用于在 Xbox 上部署。的Xbox 垃圾收集器真的很慢 - 这意味着我需要保留 分配到最低限度,最好 不存在(这会阻止 从曾经运行的收集器)

【问题讨论】:

    标签: c# locking parallel-processing garbage


    【解决方案1】:

    虽然内部分配查看同步块是惰性的(但这是我从 Essential.NET '第 1 卷'知道的 IIRC 的实现细节,或者它是通过 C# 的 CLR - 应该被视为那样),简单不需要像您建议的那样装箱的物品的情况 - 请参阅Why lock(<integer var>) is not allowed, but Monitor.Enter(<integer var>) allowed?

    【讨论】:

    • 好的,这样可以确认锁定值类型确实分配,但是锁定引用类型呢?
    • @Martin:1. 你不能锁定一个值类型——你需要把它装箱并“锁定盒子”。 2.关于引用,它在内部分配一些东西[在需要之前它是空的],但它不是.NET对象,它是CLR拥有的内部结构。例如,您不应该在 .NET 分析器中看到影响——尽管本机级别的内存使用可能会受到影响。这让我们想到了“你需要知道什么”?
    • @Martin:正如我所说 - 就影响 GC 而言,发生的分配绝对不是 CLR 分配,所以不 - 它不应该影响它。我所说的是一个简单的内部实现细节——即,它不会做任何愚蠢的事情,比如为每个对象分配一个 Win32 关键部分,只是因为理论上任何引用对象都是可锁定的。虽然我不是 CLR 内部专家,但我对这一事实有足够的信心,不会从我的桌子的另一端拉出 Esential .NET 书来查找它:P
    • 好的,所以我将把它作为一个给定的锁没有分配。我想你对这些东西没有任何参考吗? ://
    • 明天将在 Essential.NET 中查看并发布。
    【解决方案2】:

    如果您正在考虑使用:

    锁定(这个)

    您应该知道,因为您正在查看您的实例,您的用户 班级也可以锁定它并把你搞砸。这是否是一个 问题取决于您认为您的用户可能会做什么。同样的情况 如果您正在这样做,则存在:

    lock(typeof(MyClass))

    如果您不想这样做,您可以轻松分配静态或实例 对象(即对象 myLock = new object()),然后锁定它。

    Source

    至于锁定引用类型与值类型,这个SO question on Locking a resource when obtained... 有答案:

    这取决于类型 - 如果一个 引用类型然后是,如果一个值 类型号这也是为什么你应该 从不,从不锁定一个值类型,因为 值类型将被装箱并且任何 随后尝试锁定它 value 实际上会获得一个锁定 不同的对象。

    lock语句的定义:

    lock 语句(C# 参考)

    lock 关键字标记一个语句 块作为关键部分 获得互斥锁 对于给定的对象,执行 声明,然后释放 锁。

    这个SO question on lock keyword in C# 可能会提供帮助。也可以看Why lock() is not allowed, but Monitor.Enter() allowed?

    编译器规范定义了behavior of lock like so

    编译时类型 锁定语句的表达式应 是引用类型或 > 类型 参数(§25.1.1)已知为 参考类型。这是一个编译时 编译时类型的错误 表示值类型的表达式。

    【讨论】:

    • 这告诉了我很多关于锁的一般信息。但它仍然没有回答真正的问题。我想知道在锁定引用类型时是否分配了锁。如果您阅读我的问题,我说我已经知道关于锁定值类型:P
    • @Martin:我找不到任何说它的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多