다음을 통해 공유


뮤텍스

개체 Mutex를 사용하여 리소스에 대한 단독 액세스를 제공할 수 있습니다. 클래스는 Mutex 클래스보다 Monitor 더 많은 시스템 리소스를 사용하지만 애플리케이션 도메인 경계를 넘어 마샬링할 수 있고, 여러 대기와 함께 사용할 수 있으며, 다른 프로세스에서 스레드를 동기화하는 데 사용할 수 있습니다. 관리되는 동기화 메커니즘을 비교하려면 동기화 기본 형식 개요를 참조하세요.

코드 예제는 생성자에 대한 Mutex 참조 설명서를 참조하세요.

뮤텍스 사용

스레드는 소유권을 WaitOne 요청하기 위해 뮤텍스의 메서드를 호출합니다. 호출은 뮤텍스를 사용할 수 있거나 선택적 시간 제한 간격이 경과할 때까지 차단됩니다. 뮤텍스를 소유하는 스레드가 없는 경우 뮤텍스의 상태가 신호로 전송됩니다.

스레드는 메서드를 호출하여 뮤텍스를 해제합니다 ReleaseMutex . 뮤텍스에는 스레드 선호도가 있습니다. 즉, 뮤텍스를 소유한 스레드에서만 뮤텍스를 해제할 수 있습니다. 스레드가 소유하지 않은 뮤텍스를 해제하면 해당 스레드에서 ApplicationException 예외가 발생합니다.

클래스 MutexWaitHandle에서 파생되었으므로, 다른 대기 핸들과 함께 WaitAll의 소유권을 요청하기 위해 정적 WaitAny 또는 WaitHandle 메서드를 Mutex에서 호출할 수 있습니다.

스레드가 Mutex를 소유한 경우, 해당 스레드는 실행이 차단되지 않도록 반복적인 대기 요청 호출에서 동일한 Mutex을 지정할 수 있습니다. 그러나 소유권을 해제하려면 Mutex를 여러 번 해제해야 합니다.

포기된 뮤텍스

스레드가 Mutex를 해제하지 않고 종료되면 뮤텍스는 방치되었다고 합니다. 이는 뮤텍스가 보호하는 리소스가 일관성 없는 상태로 남을 수 있기 때문에 심각한 프로그래밍 오류를 나타내는 경우가 많습니다. AbandonedMutexException는 뮤텍스를 획득하는 다음 스레드에서 던져집니다.

시스템 전체 뮤텍스의 경우 중단된 뮤텍스는 애플리케이션이 갑자기 종료되었음을 나타낼 수 있습니다(예: Windows 작업 관리자 사용).

로컬 및 시스템 뮤텍스

뮤텍스는 로컬 뮤텍스와 명명된 시스템 뮤텍스의 두 가지 유형입니다. 이름을 허용하는 생성자를 사용하여 개체를 만드는 Mutex 경우 해당 이름의 운영 체제 개체와 연결됩니다. 명명된 시스템 뮤텍스는 운영 체제 전체에 표시되며 프로세스 활동을 동기화하는 데 사용할 수 있습니다. 동일한 명명된 시스템 뮤텍스를 나타내는 여러 Mutex 개체를 만들 수 있으며 이 메서드를 사용하여 OpenExisting 명명된 기존 시스템 뮤텍스를 열 수 있습니다.

로컬 뮤텍스는 프로세스 내에만 존재합니다. 로컬 Mutex 개체에 대한 참조가 있는 프로세스의 모든 스레드에서 사용할 수 있습니다. 각 Mutex 개체는 별도의 로컬 뮤텍스입니다.

시스템 뮤텍스에 대한 액세스 제어 보안

.NET Framework는 명명된 시스템 개체에 대한 Windows 액세스 제어 보안을 쿼리하고 설정하는 기능을 제공합니다. 시스템 개체는 전역이므로 사용자 고유의 코드가 아닌 다른 코드로 잠글 수 있으므로 생성 시점부터 시스템 뮤텍스를 보호하는 것이 좋습니다.

뮤텍스에 대한 액세스 제어 보안에 대한 정보는 MutexSecurity 클래스와 MutexAccessRule 클래스, MutexRights 열거형, GetAccessControl 클래스의 SetAccessControl, OpenExisting, Mutex 메서드, 그리고 Mutex(Boolean, String, Boolean, MutexSecurity) 생성자를 참조하세요.

비고

시스템 뮤텍스에 대한 액세스 제어 보안은 .NET Framework에서만 사용할 수 있으며 .NET Core 또는 .NET 5 이상에서는 사용할 수 없습니다.

참고하십시오