Я использую следующий код для синхронизации взаимоисключающего доступа к общему ресурсу между несколькими запущенными процессами.
Мьютекс создается как таковой:
Mutex mtx = new Mutex(false, "MyNamedMutexName");
Затем я использую этот метод для ввода взаимоисключающего раздела:
public bool enterMutuallyExclusiveSection()
{
//RETURN: 'true' if entered OK,
// can continue with mutually exclusive section
bool bRes;
try
{
bRes = mtx.WaitOne();
}
catch (AbandonedMutexException)
{
//Abandoned mutex, how to handle it?
//bRes = ?
}
catch
{
//Some other error
bRes = false;
}
return bRes;
}
и этот код, чтобы оставить его:
public bool leaveMutuallyExclusiveSection()
{
//RETURN: = 'true' if no error
bool bRes = true;
try
{
mtx.ReleaseMutex();
}
catch
{
//Failed
bRes = false;
}
return bRes;
}
Но случается, что если один из запущенных процессов выходит из строя или если он завершен из диспетчера задач, мьютекс может возвращать исключение AbandonedMutexException
. Итак, мой вопрос: какой изящный способ выбраться из этого?
Это работает нормально:
catch (AbandonedMutexException)
{
//Abandoned mutex
mtx.ReleaseMutex();
bRes = mtx.WaitOne();
}
Но могу ли я ввести взаимоисключающий раздел в этом случае?
Может кто-нибудь уточнить?