Должен ли я избавиться от Mutex? - PullRequest
12 голосов
/ 18 августа 2011

Я работаю над двумя службами Windows, которые имеют общую базу данных, которую я хочу заблокировать (кросс-процесс) с помощью системы Mutex.

Теперь мне интересно, можно ли просто вызывать WaitOne() и ReleaseMutex() в блоке try-finally или мне также следует использовать Mutex (например, в блоке using). Если это так, я думаю, что я всегда должен ловить AbandonedMutexException на методе WaitOne(), или я здесь не прав?

Ответы [ 3 ]

15 голосов
/ 18 августа 2011

Мьютекс - это объект ядра Windows (здесь он заключен в объект .NET).

Как таковой, это неуправляемый ресурс, который должен быть утилизирован.

Точнее, объект .NET содержит РУЧКУ для мьютекса, которую нужно каким-то образом освободить / утилизировать.

Я не верю этому образцу кода в классе Mutex , где объект мьютекса не расположен. Хотя у Хензи есть хороший комментарий: объект Mutex является статическим и может быть уничтожен финализатором или уничтожен ядром Windows при выходе из процесса.

Также обратите внимание, что Close () также удаляет объект.

Конечно, нет ничего плохого в том, чтобы сохранить существующий объект Mutex в вашем приложении, даже если вы его не используете. Это легкие ресурсы.

9 голосов
/ 18 августа 2011

Согласно это имя Mutex автоматически уничтожается, когда завершается последний процесс, содержащий HANDLE этого Mutex.

В неуправляемомMSDN говорит:

Используйте функцию CloseHandle, чтобы закрыть ручку.Система закрывает ручку автоматически, когда процесс завершается.Объект мьютекса уничтожается при закрытии его последнего дескриптора.

В .NET вы должны вызвать .Close() на Mutex - это освобождает HANDLE... поскольку каждый процесс получает свой собственный HANDLE при доступе даже к одному и тому же имени Mutex, это непротиворечивая практика ... не вызывая Close() не оставит никаких проблем, как только процесс исчезнет (финализаторы и все)...

2 голосов
/ 18 августа 2011

Вам необходимо избавиться от ресурсов, используемых ручкой ожидания.

Из документации:

Освобождает все ресурсы, используемые текущим экземпляром класса WaitHandle.(Унаследовано от WaitHandle.)

Ручка ожидания использует неуправляемые ресурсы, которые должны быть удалены в конце использования.

Документация MSDN Mutex

...