2013-03-01 4 views
-1

MSDN Mutex Class говорит (в комментариях к коду примера):Использует ли .NET mutex неуправляемые ресурсы? Статья

В отличии от мониторов, мьютекс может использоваться с WaitHandle.WaitAll и WaitAny, и может быть передан через границу AppDomain

делает его означает, что мьютексы используют неуправляемые последствия?
Почему, например, пример кода MSDN при использовании Mutex не использует Dispose()?

+1

http://stackoverflow.com/questions/7107079/should-i-dispose-a-mutex – adt

+0

В документации упоминается что-либо?. Если класс 'Mutex'« задействует »неуправляемые ресурсы или нет, он может быть частью соглашения, если он предлагается, или нет. Если это не является частью конвенции, то лучше верить, что детали реализации могут когда-нибудь измениться (и что ответ на этот вопрос может не быть неизменным на протяжении всей жизни .NET BCL), а не основывать ваши архитектурные решения на это текущее статус-кво. Относительно 'IDisposable'. Существует много примеров классов, которые «участвуют» в неуправляемых ресурсах, и которые этого не делают (например: «Thread») –

+0

'Mutex' реализует' IDisposable', поэтому вы вызываете 'Dispose'. Документация имеет приоритет над образцом кода, который был обрезан, чтобы проиллюстрировать концепцию. – shambulator

ответ

2

Mutex и многие другие объекты синхронизации являются обертками вокруг разных объектов ядра (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724485(v=vs.85).aspx), поэтому да, они используют неуправляемые ресурсы под капотом.

Вы должны позвонить .Dispose, когда вы закончите с ними, однако они будут освобождены, когда ваш процесс выйдет или когда финализатор с запуском (если вы его не уложили), поэтому я предполагаю, что для простоты примеров они просто не Dispose их должным образом.

Примечание от MSDN о WaitHandles:

 
Always call Dispose before you release your last reference to the WaitHandle. 
Otherwise, the resources it is using will not be 
freed until the garbage collector calls the WaitHandle object's Finalize method. 
0

Да, вы должны распоряжаться Mutex как он наследует WaitHandle, который реализует IDisposable.

Внутренний, Mutex является оболочкой для объекта ядра, созданного CreateMutext. Я предполагаю, что реализация класса .Net Mutex вызывает CloseHandle, чтобы закрыть дескриптор объекта ядра.

В любом случае такой ручка будет автоматически закрыта системой при выходе из процесса.

Смежные вопросы