【问题标题】:Lock in Framework 3.5 vs 4.0?锁定框架 3.5 和 4.0?
【发布时间】:2012-11-29 11:49:03
【问题描述】:

AFAIKlock 在这两个版本中是有区别的。

Framework 4 增加了一项检查是否在监视器进入期间出现异常(如内存不足异常)

还有一个lockTaken 标志指示是否应该释放锁(在finally 子句中)(由于try 子句中的失败代码)。

有点像

bool lockTaken = false;
try
{
   Monitor.Enter (lockObj, ref lockTaken);
   ...
}
finally { if (lockTaken) Monitor.Exit (lockObj); }

(非常类似于using 代码(dispose...))

但是通过反射器观看我看到完全不同的东西:

[SecuritySafeCritical]
public static void Enter(object obj, ref bool lockTaken)
{
    if (lockTaken)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_MustBeFalse"), "lockTaken");
    }
    ReliableEnter(obj, ref lockTaken);
}

try 的模式到底在哪里?

我错过了什么?

【问题讨论】:

  • 在第一个 sn-p 中您正在查看方法调用,在第二个中查看被调用方法的实现。
  • @dtb 这就是 c# 4.0 翻译锁定语句的方式(编辑了标题)。

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


【解决方案1】:

您应该查看使用lock 语句的反编译方法,而不是查看框架的代码。因此,如果您尝试反编译以下方法:

object syncRoot = new object();
void Foo()
{
  lock(syncRoot) {}
}

你会看到你所期望的:

void Foo()
{
  bool lockTaken;
  try
  {
    Monitor.Enter(syncRoot, out lockTaken);
  }
  finally
  {
    if (lockTaken)
        Monitor.Exit(syncRoot);
  }
}

【讨论】:

  • 谢谢谢尔盖。我不知道编译器可以发出比 FW 代码更多的代码。
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2014-10-14
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多