将 WaitOne 与 IPC 的命名互斥体一起使用时,可以有一个空的 while 块吗?
Is it OK to have an empty while block when using WaitOne with named mutexes for IPC?
基本上,同一进程的多个实例将执行此操作:
using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME))
{
while (!mutex.WaitOne(100)) { /* wait to acquire mutex from other process */ }
try
{
doSynchronizedWork();
}
finally
{
mutex.ReleaseMutex();
}
}
会不会有什么坑? process 可以在不释放互斥量的情况下退出吗?如果发生这种情况,真的会抛出 AbandonedMutexException
吗?或者另一个进程会获取互斥锁吗?还有别的吗?
编辑:
看起来正确的方法(至少在我的情况下)应该是这样做的:
using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME))
{
bool lockObtained = false;
while (!lockObtained)
{
try
{
while (!mutex.WaitOne()) { /* wait to acquire mutex */ }
lockObtained = true;
}
catch (AbandonedMutexException ignored)
{
// mutex abandoned by another
// process before that process completed.
// We can now try to obtain it again.
}
}
try
{
doSynchronizedWork();
}
finally
{
mutex.ReleaseMutex();
}
}
这有什么意义?只需等待即可。
当一个进程退出时,所有资源都被清理干净。必须假定 AbandonedMutexException
能够在 IPC 场景中发生,因为另一个进程可能随时失败(由于错误或内存不足等)。
如果您这样做是为了让 Thread.Abort
起作用:Thread.Abort
非常危险。发表评论,我将能够帮助您迁移到更好的东西。
基本上,同一进程的多个实例将执行此操作:
using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME))
{
while (!mutex.WaitOne(100)) { /* wait to acquire mutex from other process */ }
try
{
doSynchronizedWork();
}
finally
{
mutex.ReleaseMutex();
}
}
会不会有什么坑? process 可以在不释放互斥量的情况下退出吗?如果发生这种情况,真的会抛出 AbandonedMutexException
吗?或者另一个进程会获取互斥锁吗?还有别的吗?
编辑:
看起来正确的方法(至少在我的情况下)应该是这样做的:
using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME))
{
bool lockObtained = false;
while (!lockObtained)
{
try
{
while (!mutex.WaitOne()) { /* wait to acquire mutex */ }
lockObtained = true;
}
catch (AbandonedMutexException ignored)
{
// mutex abandoned by another
// process before that process completed.
// We can now try to obtain it again.
}
}
try
{
doSynchronizedWork();
}
finally
{
mutex.ReleaseMutex();
}
}
这有什么意义?只需等待即可。
当一个进程退出时,所有资源都被清理干净。必须假定 AbandonedMutexException
能够在 IPC 场景中发生,因为另一个进程可能随时失败(由于错误或内存不足等)。
如果您这样做是为了让 Thread.Abort
起作用:Thread.Abort
非常危险。发表评论,我将能够帮助您迁移到更好的东西。