C# 理解互斥类
我对理解C# 理解互斥类,c#,mutex,C#,Mutex,我对理解互斥体类的工作原理有点困惑 假设我有一个这样的代码,它将由多个任务执行: bool lockAcquired = mutex.WaitOne(); try { sharedVar += 1; } finally { if (lockAcquired) mutex.ReleaseMutex(); } 我的理解(如果我错了,请纠正我)是,当它到达mutex.WaitOne(),它将首先等待另一个线程执行ReleaseMutex(),然后继续执行后续语句。因此,如果另一个线
互斥体
类的工作原理有点困惑
假设我有一个这样的代码,它将由多个任务执行:
bool lockAcquired = mutex.WaitOne();
try
{
sharedVar += 1;
}
finally
{
if (lockAcquired) mutex.ReleaseMutex();
}
我的理解(如果我错了,请纠正我)是,当它到达
mutex.WaitOne()
,它将首先等待另一个线程执行ReleaseMutex()
,然后继续执行后续语句。因此,如果另一个线程有锁,它将不会继续执行try..finally
语句。如果它获得了锁,那么这就是它将继续执行下一个代码的时间<代码>锁获取将为真
然后。我的问题是,如果只有在获取锁时才会执行finally
语句,为什么我需要检查lockAcquired
在finally
语句中是否为true
。这意味着finally
块中的if
语句将始终执行。谢谢。没有理由检查此代码中的lockAcquired
。如果要检查它,可能应该在关闭互斥锁保护的状态之前检查它。根据,返回值为:
true
如果当前实例接收到信号。如果从未向当前实例发送信号,WaitOne
从未返回
这意味着检查返回值没有意义,它永远不会是
false
Mutex
可能非常棘手。我强烈建议,除非您的要求非常具体,否则请使用锁
和监视器
。这些应该可以满足99%的同步需求。如果执行WaitOne()
方法之后的代码,则表示线程获取了锁。检查lockAcquired
是否为真有什么用?谢谢,我只是很困惑,因为在调用ReleaseMutex
之前,我看到了一些检查返回值的例子。对于WaitOne()
的返回值可能总是真的,但是对于任何超时重载,比如WaitOne(Int32)
或WaitOne>(TimeSpan)
当超时期限到期时,它将为false,因此您绝对需要检查它。