以不同的方法开始和结束锁定

本文关键字:结束 锁定 开始 方法 | 更新日期: 2023-09-27 17:57:55

出于不明确的原因,我想在一个方法中启动一个锁,然后在另一个方法结束它。不知怎么的:

object mutex = new object();
void Main(string[] args)
{
    lock (mutex)
    {
        doThings();
    }
}

将具有与相同的行为

object mutex = new object();
void Main(string[] args)
{
    Foo();
    doThings();
    Bar();
}
void Foo()
{
    startLock(mutex);
}
void Bar()
{
    endlock(mutex);
}

当然,问题是lock关键字在块语法中起作用。我知道锁不应该这样使用,但我对S/O的创造性和技巧性解决方案持开放态度:)

以不同的方法开始和结束锁定

private readonly object syncRoot = new object();
void Main(string[] args)
{
    Foo();
    doThings();
    Bar();
}
void Foo()
{
    Monitor.Enter(syncRoot);
}
void Bar()
{
    Monitor.Exit(syncRoot);
}

[编辑]

当您使用lock时,这就是中引擎盖下发生的情况。网络4:

bool lockTaken = false;
try
{
    Monitor.Enter(syncRoot, ref lockTaken);
    // code inside of lock
}
finally
{
    if (lockTaken)
        Monitor.Exit(_myObject);
}