以不同方法开始和完成锁定

Laz*_*zlo 7 .net c# parallel-processing multithreading locking

我想 - 由于晦涩的原因,你不应该质疑 - 开始锁定方法,然后在另一个方法中结束.不知何故喜欢:

object mutex = new object();

void Main(string[] args)
{
    lock (mutex)
    {
        doThings();
    }
}
Run Code Online (Sandbox Code Playgroud)

会有如下行为:

object mutex = new object();

void Main(string[] args)
{
    Foo();
    doThings();
    Bar();
}

void Foo()
{
    startLock(mutex);
}

void Bar()
{
    endlock(mutex);
}
Run Code Online (Sandbox Code Playgroud)

当然,问题是lock关键字以块语法工作.我知道锁并不意味着像这样使用,但我不仅仅对S/O的创意和hacky解决方案持开放态度.:)

Ale*_*Aza 16

private readonly object syncRoot = new object();

void Main(string[] args)
{
    Foo();
    doThings();
    Bar();
}

void Foo()
{
    Monitor.Enter(syncRoot);
}

void Bar()
{
    Monitor.Exit(syncRoot);
}
Run Code Online (Sandbox Code Playgroud)

[ 编辑 ]

当你使用时lock,这就是.NET 4中引发的内容:

bool lockTaken = false;
try
{
    Monitor.Enter(syncRoot, ref lockTaken);

    // code inside of lock
}
finally
{
    if (lockTaken)
        Monitor.Exit(_myObject);
}    
Run Code Online (Sandbox Code Playgroud)

  • 显然,这段代码根本不能处理异常(线程堕胎特别邪恶). (2认同)