Подтвердить что ты не робот

Как изящно выйти из AbandonedMutexException?

Я использую следующий код для синхронизации взаимоисключающего доступа к общему ресурсу между несколькими запущенными процессами.

Мьютекс создается как таковой:

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();    
    }

Но могу ли я ввести взаимоисключающий раздел в этом случае?

Может кто-нибудь уточнить?

4b9b3361

Ответ 1

В соответствии с MSDN AbandonedMutexException:

Исключение, которое возникает, когда один поток получает объект Mutex что другой поток отказался от выхода, не выпуская его.

Это означает, что поток, в котором было выбрано это исключение, является новым владельцем Mutex (в противном случае вызывается Mutex.ReleaseMutex Method, как вы делаете, вызовет ApplicationException), и если вы сможете гарантировать целостность структур данных, защищенных mutex вы можете просто игнорировать исключение и продолжать выполнять свое приложение в обычном режиме.

Однако в большинстве случаев исключение AbandonedMutexException целостность структур данных, защищенных мьютексом, не может быть гарантирована, и почему это исключение было введено в версии 2.0 платформы .NET:

Заброшенный мьютекс указывает на серьезную ошибку программирования. Когда потоки выходят без освобождения мьютекса, структуры данных защищенные мьютексом, могут не находиться в согласованном состоянии. До версии 2.0.NET Framework, такие проблемы трудно обнаружить потому что не было сделано никаких исключений, если ожидание завершилось в результате заброшенный мьютекс.