【发布时间】:2023-12-27 06:38:01
【问题描述】:
我有一个使用 Mutex 的应用程序(不是我写的),如下所示:
static void Main(string[] args)
{
Mutex mutex = null;
try
{
mutex = Mutex.OpenExisting("SINGLEINSTANCE");
if (mutex != null)
{
return;
}
}
catch (WaitHandleCannotBeOpenedException ex)
{
mutex = new Mutex(true, "SINGLEINSTANCE");
}
// critical section here
}
但我知道正确的做法是这样的:
private readonly Mutex m = new Mutex("SINGLEINSTANCE");
static void Main(string[] args) {
m.WaitOne();
try {
/* critical code */
}
finally {
m.ReleaseMutex();
}
}
这是因为这个应用程序只有一个进程可以同时运行。它是一个控制台应用程序,为 Web 应用程序执行一些异步工作。
这段代码正在生产中,我不想改变它,除非这段代码有什么大问题......有吗?
【问题讨论】:
-
如果它在生产中并且没有损坏,那么您为什么要更改或修复它?
-
您的“正确方式”有不同的行为。如果互斥锁存在,旧方法将关闭程序,您的新方法只是等待互斥锁空闲。但是,旧方式仍然存在竞争条件。此外,Mutex 构造函数将
bool作为参数,该布尔值的 true 或 false 会极大地影响您的代码在此用例中的工作方式。
标签: c# synchronization mutex interprocess