Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 理解互斥类_C#_Mutex - Fatal编程技术网

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,因此您绝对需要检查它。