C# 互斥量处理
C# Mutex handling
我不确定是否完全理解如何处理互斥量。
我只需要一个进程 运行 一次,但如果由于任何原因它崩溃或意外关闭,我还需要重置废弃的互斥量。
出于这个原因,我发出了一个帮助程序调用,试图获取一个带有超时的互斥体(按名称标识)。如果它无法获取互斥锁,则 return NULL 否则它 return 将由方法调用者处理的互斥锁。
如果互斥锁被放弃,我将重置它并认为请求失败(这不是代码用于定期过程的问题,如果锁定有时失败,那么该过程将恢复到下一个 运行) .
我想问的是,如果有一些我没有考虑到的情况可能会给我带来问题
这里是代码:
public class MutexManager
{
/// <summary>
/// Try to acquire a global mutex
/// </summary>
/// <param name="mutexName">Mutex unique name</param>
/// <param name="timeout_ms">Timeout in milliseconds (Optional : default = 5000, if <= 0 no timeout is applied, infinite wait and possibile daeadlock) </param>
/// <returns>The acquired Mutex or null if Mutex can not be acquired</returns>
public static Mutex TryRegister(string mutexName, int timeout_ms = 5000)
{
// unique id for global mutex - Global prefix means it is global to the machine
string mutexId = string.Format("Global\{{{0}}}", mutexName);
bool createdNew;
var allowEveryoneRule =new MutexAccessRule( new SecurityIdentifier(WellKnownSidType.WorldSid
, null)
, MutexRights.FullControl
, AccessControlType.Allow
);
Mutex mutex = null;
{
mutex = new Mutex(false, mutexId, out createdNew);
var hasHandle = false;
try
{
hasHandle = mutex.WaitOne(timeout_ms, false);
if (hasHandle == false)
return null;
else
return mutex;
}
catch (AbandonedMutexException)
{
mutex.ReleaseMutex();
mutex.Close();
mutex.Dispose();
return null;
}
catch (Exception err)
{
return null;
}
}
}
}
这里我将如何使用上面的 class。下面的代码用于周期性程序(通过 windows 调度程序进行调度)所以如果有时出错不是问题(下一个 运行 将完成工作)重要的是没有竞争 -条件或死锁
using ( var mutex = MutexManager.TryRegister("procedureName") )
{
...DO WORK
}
Mutex 由单个进程“拥有”,如果进程崩溃或关闭,Mutex 将被释放。
如果进程崩溃并且 Mutex 被释放,则它被视为“已放弃”,这是一种表示原始进程不再拥有它的方式——但也没有明确释放它。
我在你的问题或代码中不太理解的是废弃互斥锁的处理。如果之前没有被放弃,助手只会 return 一个 Mutex。如果它被放弃,代码会成功检索 Mutex,然后释放它,returns 根本不提供 Mutex。
这可能是意图,但根据问题的措辞,有点难以理解。如果 helper 打算重置 和 return Mutex,那么 AbandonedMutexException
的处理看起来不正确,因为它总是 return空。
我不确定是否完全理解如何处理互斥量。 我只需要一个进程 运行 一次,但如果由于任何原因它崩溃或意外关闭,我还需要重置废弃的互斥量。
出于这个原因,我发出了一个帮助程序调用,试图获取一个带有超时的互斥体(按名称标识)。如果它无法获取互斥锁,则 return NULL 否则它 return 将由方法调用者处理的互斥锁。 如果互斥锁被放弃,我将重置它并认为请求失败(这不是代码用于定期过程的问题,如果锁定有时失败,那么该过程将恢复到下一个 运行) .
我想问的是,如果有一些我没有考虑到的情况可能会给我带来问题
这里是代码:
public class MutexManager
{
/// <summary>
/// Try to acquire a global mutex
/// </summary>
/// <param name="mutexName">Mutex unique name</param>
/// <param name="timeout_ms">Timeout in milliseconds (Optional : default = 5000, if <= 0 no timeout is applied, infinite wait and possibile daeadlock) </param>
/// <returns>The acquired Mutex or null if Mutex can not be acquired</returns>
public static Mutex TryRegister(string mutexName, int timeout_ms = 5000)
{
// unique id for global mutex - Global prefix means it is global to the machine
string mutexId = string.Format("Global\{{{0}}}", mutexName);
bool createdNew;
var allowEveryoneRule =new MutexAccessRule( new SecurityIdentifier(WellKnownSidType.WorldSid
, null)
, MutexRights.FullControl
, AccessControlType.Allow
);
Mutex mutex = null;
{
mutex = new Mutex(false, mutexId, out createdNew);
var hasHandle = false;
try
{
hasHandle = mutex.WaitOne(timeout_ms, false);
if (hasHandle == false)
return null;
else
return mutex;
}
catch (AbandonedMutexException)
{
mutex.ReleaseMutex();
mutex.Close();
mutex.Dispose();
return null;
}
catch (Exception err)
{
return null;
}
}
}
}
这里我将如何使用上面的 class。下面的代码用于周期性程序(通过 windows 调度程序进行调度)所以如果有时出错不是问题(下一个 运行 将完成工作)重要的是没有竞争 -条件或死锁
using ( var mutex = MutexManager.TryRegister("procedureName") )
{
...DO WORK
}
Mutex 由单个进程“拥有”,如果进程崩溃或关闭,Mutex 将被释放。
如果进程崩溃并且 Mutex 被释放,则它被视为“已放弃”,这是一种表示原始进程不再拥有它的方式——但也没有明确释放它。
我在你的问题或代码中不太理解的是废弃互斥锁的处理。如果之前没有被放弃,助手只会 return 一个 Mutex。如果它被放弃,代码会成功检索 Mutex,然后释放它,returns 根本不提供 Mutex。
这可能是意图,但根据问题的措辞,有点难以理解。如果 helper 打算重置 和 return Mutex,那么 AbandonedMutexException
的处理看起来不正确,因为它总是 return空。