2011-08-18 10 views
10

저는 시스템 뮤텍스 (Mutex)로 잠그고 (교차 처리) 싶은 공용 데이터베이스가있는 2 개의 Windows 서비스에서 작업하고 있습니다. 뮤텍스를 폐기해야합니까?

는 지금은, (예를 들어, using 블록에) 그냥 try-finally 블록에 WaitOne()ReleaseMutex()를 호출해도 괜찮은지 또는 나는 또한 뮤텍스를 처리해야하는지 여부를 궁금하네요. 그렇다면 나는 을 WaitOne() 메쏘드에 붙이거나 내가 틀렸을 까?

+0

뮤텍스를 소유 한 서비스가 예기치 않게 종료되었음을 알리기 위해서는 AbandonedMutexException이 필요합니다. 어떤 경우에는 dbase 사용을 멈추고 다른 서비스가 다시 시작될 때까지 대기해야합니다.중재자 역할을하는 제 3 프로세스를 사용하는 것이 현명합니다. –

답변

12

뮤텍스 (여기서는 .NET 개체에 싸여)는 Windows 커널 개체입니다.

이와 같이, 처리해야하는 관리되지 않는 리소스입니다.

보다 정확하게, .NET 객체에는 뮤텍스에 대한 핸들이 들어 있습니다.이 뮤텍스는 어떻게 든 릴리스 또는 폐기되어야합니다.

뮤텍스 개체가 삭제되지 않은 code sample in the Mutex class docs을 신뢰하지 않습니다. Henzi는 주석에 좋은 점이 있습니다. Mutex 객체는 정적이며 프로세스가 종료 될 때 Windows 커널에 의해 종료 자나 폐기 될 것입니다.

또한 Close()도 개체를 처리합니다.

물론, 사용하지 않는 동안에도 기존 뮤텍스 객체를 앱에 보관하는 데는 아무런 문제가 없습니다. 그것들은 가벼운 자원입니다.

+0

왼쪽에 코드 샘플이 없으므로 링크해야합니다. http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –

+1

done. 다음 번엔 내 대답을 편집 해 주시기 바랍니다 ;-) –

+0

Windows 서비스를 만들고 있기 때문에 항상 내 서비스의 "런타임"동안 폐기해야한다고 생각합니다. 매번 동일한 이름을 가진 새로운 Mutex 인스턴스를 생성하면 관리되지 않는 동일한 인스턴스가 바로 래핑됩니까? 아니면 새로운 관리되지 않는 리소스를 반복해서 만들 것입니까? 내 서비스 중 하나가 정말 그것을 정리하기 위해 중단되면 뮤텍스를 닫을 수 있습니까? – Koen

2

waithandle에서 사용하는 리소스를 처리해야합니다. 문서에서

다음 WaitHandle이 클래스의 현재 인스턴스에서 사용하는

자료 모든 자원. (WaitHandle에서 상 속됨)

waithandle은 사용 종료시 처리해야하는 관리되지 않는 리소스를 사용합니다.

MSDN Documentation Mutex

6

this에 따르면 Mutex은 해당 뮤텍스가 HANDLE 인 마지막 프로세스가 종료되면 자동으로 삭제됩니다. 비 관리 측면에서

은 MSDN은

핸들을 닫습니다 CloseHandle 기능을 사용하여 말한다. 프로세스가 종료되면 시스템은 자동으로 핸들을 닫습니다. 뮤텍스 개체는 마지막 핸들이 닫힐 때 소멸됩니다. .NET에서

Mutex.Close()를 호출해야합니다은 - Close()원 '를 호출하지 ... 심지어 같은 이름 Mutex 이것이 일관된 연습에 액세스 할 때마다 프로세스가 HANDLE 자체를 얻을 수 있기 때문에이합니다 ... HANDLE 출시 t 프로세스가 더 이상 종료되지 않으면 어떤 문제도 남기지 않습니다. (finalizers 및 all) ...