2013-07-30 216 views
2

我对理解Mutex类如何工作有点困惑。了解互斥锁类

说我有一个这样的代码将被多个任务执行:

bool lockAcquired = mutex.WaitOne(); 

try 
{ 
    sharedVar += 1; 
} 
finally 
{ 
    if (lockAcquired) mutex.ReleaseMutex(); 
} 

我的理解(纠正我,如果我错了)是它达到mutex.WaitOne()那一刻,它会先等待另一个线程在继续执行后续的语句之前执行ReleaseMutex()。因此,如果另一个线程有锁,它将不会继续并执行try..finally语句。如果它获得锁定,那么它将继续执行下一个代码。那么lockAcquired将是true。我的问题是,为什么我需要检查finally语句中的lockAcquired是否为true,如果它只在获取锁定时执行。这意味着finally块中的if语句将始终执行。谢谢。

+0

'互斥'可能会非常棘手。我会强烈建议,除非你的要求是非常具体的使用'lock'和'Monitor'。这些应该满足99%的同步需求。 – Jay

回答

1

根据the documentation,返回值是:

true如果当前实例接收的信号。如果当前实例从未发送信号,则WaitOne永不返回。

这意味着检查返回值没有意义,它永远不会是false

+0

谢谢,我只是混淆了一些例子,我在调用'ReleaseMutex'前看到了返回值的检查。 –

+0

WaitOne()的返回值可能总是为true,但对于任何超时重载(例如WaitOne(Int32)或WaitOne(TimeSpan)),当超时时间到期时它将为false,因此您绝对需要然后检查它。 – SLuck49

0

没有理由在此代码中检查lockAcquired。如果你要检查它,你应该在破解互斥锁保护的状态之前检查它。

+0

如果'WaitOne()'方法执行后的代码被执行,那就意味着这个锁被线程获取了。如果'lockAcquired'是真的,那么使用什么来检查呢? –