为什么C#编译器会复制变量来锁定?

问题描述 投票:0回答:1

我原来的代码是这样的

Object mylock = new object();
void Test()
{
    lock(mylock)
    {
        
    }
}

编译成以下代码

void Test
{
    object obj = mylock;  // add a temporary variable
    bool lockTaken = false;
    try
    {
        Monitor.Enter(obj, ref lockTaken);
    }
    finally
    {
        if (lockTaken)
        {
            Monitor.Exit(obj);
        }
    }
}

我想知道为什么要添加临时变量而不是直接使用原始变量,如下所示。

void Test
{
    bool lockTaken = false;
    try
    {
        Monitor.Enter(mylock, ref lockTaken);  // use original variable directly
    }
    finally
    {
        if (lockTaken)
        {
            Monitor.Exit(mylock);  // use original variable directly
        }
    }
}
c# locking thread-synchronization
1个回答
2
投票

几个 C# 构造(

using
lock
)被转换为最终代码,以防止重新分配所使用的变量。您确实不希望
finally
部分执行与原始操作开始时不同的值。

如果编译器仅使用

myLock
部分中
finally
的当前值,则会出现错误行为的代码示例:

 object myLock = new object();

 lock(myLock)
 {
    myLock = new object(); 
    ...
 }

请注意,编译此类代码还会带来 CS0728 警告,因为尝试更改锁定变量将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.