뮤텍스Mutexes

Mutex 개체를 사용하여 리소스에 대한 전용 액세스를 제공할 수 있습니다.You can use a Mutex object to provide exclusive access to a resource. Mutex 클래스는 Monitor 클래스보다 많은 시스템 리소스를 사용하지만 애플리케이션 도메인 경계를 넘어 마샬링될 수 있으며 여러 대기와 함께 사용될 수 있고 서로 다른 프로세스에서 스레드를 동기화하는 데 사용될 수 있습니다.The Mutex class uses more system resources than the Monitor class, but it can be marshaled across application domain boundaries, it can be used with multiple waits, and it can be used to synchronize threads in different processes. 관리되는 동기화 메커니즘의 비교는 동기화 기본 형식 개요를 참조하세요.For a comparison of managed synchronization mechanisms, see Overview of Synchronization Primitives.

코드 예제는 Mutex 생성자에 대한 참조 설명서를 참조하세요.For code examples, see the reference documentation for the Mutex constructors.

뮤텍스 사용Using Mutexes

스레드는 소유권을 요청하는 뮤텍스의 WaitOne 메서드를 호출합니다.A thread calls the WaitOne method of a mutex to request ownership. 호출은 뮤텍스를 사용할 수 있거나 선택적 시간 제한 간격이 경과할 때까지 차단합니다.The call blocks until the mutex is available, or until the optional timeout interval elapses. 뮤텍스의 상태는 스레드가 소유하지 않는 경우 신호를 받습니다.The state of a mutex is signaled if no thread owns it.

스레드는 해당 ReleaseMutex 메서드를 호출하여 뮤텍스를 해제합니다.A thread releases a mutex by calling its ReleaseMutex method. 뮤텍스에는 스레드 선호도가 있습니다. 즉, 뮤텍스를 소유하는 스레드에 의해서만 해제될 수 있습니다.Mutexes have thread affinity; that is, the mutex can be released only by the thread that owns it. 스레드가 소유하지 않는 뮤텍스를 해제하는 경우 스레드에서 ApplicationException이 throw됩니다.If a thread releases a mutex it does not own, an ApplicationException is thrown in the thread.

Mutex 클래스는 WaitHandle에서 파생되므로 WaitHandle의 정적 WaitAll 또는 WaitAny 메서드를 호출하여 다른 대기 핸들과 결합하여 Mutex의 소유권을 요청할 수도 있습니다.Because the Mutex class derives from WaitHandle, you can also call the static WaitAll or WaitAny methods of WaitHandle to request ownership of a Mutex in combination with other wait handles.

스레드가 Mutex를 소유하는 경우 해당 스레드는 해당 실행을 차단하지 않고 반복되는 대기 요청 호출에서 동일한 Mutex를 지정할 수 있지만 소유권을 해제하는 횟수만큼 Mutex를 해제해야 합니다.If a thread owns a Mutex, that thread can specify the same Mutex in repeated wait-request calls without blocking its execution; however, it must release the Mutex as many times to release ownership.

중단된 뮤텍스Abandoned Mutexes

스레드가 Mutex를 해제하지 않고 종료하는 경우 뮤텍스는 중단되도록 명령됩니다.If a thread terminates without releasing a Mutex, the mutex is said to be abandoned. 뮤텍스가 보호하는 리소스가 일관성 없는 상태로 남을 수도 있으므로 이는 종종 심각한 프로그래밍 오류를 나타냅니다.This often indicates a serious programming error because the resource the mutex is protecting might be left in an inconsistent state. .NET Framework 버전 2.0에서 AbandonedMutexException은 뮤텍스를 획득하는 다음 스레드에서 throw됩니다.In the .NET Framework version 2.0, an AbandonedMutexException is thrown in the next thread that acquires the mutex.

참고

.NET Framework 버전 1.0 및 1.1에서 중단된 Mutex는 신호 받음 상태로 설정되고 다음 대기 스레드는 소유권을 가져옵니다.In the .NET Framework versions 1.0 and 1.1, an abandoned Mutex is set to the signaled state and the next waiting thread gets ownership. 대기 중인 스레드가 없는 경우 Mutex는 신호 받음 상태로 유지됩니다.If no thread is waiting, the Mutex remains in a signaled state. 예외가 throw되지 않습니다.No exception is thrown.

시스템 차원 뮤텍스의 경우 중단된 뮤텍스는 애플리케이션이 갑자기 종료되었음을 나타낼 수 있습니다(예: Windows 작업 관리자를 사용하여).In the case of a system-wide mutex, an abandoned mutex might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager).

로컬 및 시스템 뮤텍스Local and System Mutexes

뮤텍스는 로컬 뮤텍스 및 명명된 시스템 뮤텍스로 두 가지 유형입니다.Mutexes are of two types: local mutexes and named system mutexes. 이름을 허용하는 생성자를 사용하여 Mutex 개체를 만드는 경우 해당 이름의 운영 체제 개체에 연결됩니다.If you create a Mutex object using a constructor that accepts a name, it is associated with an operating-system object of that name. 명명된 시스템 뮤텍스는 운영 체제 전체에서 볼 수 있으며 프로세스 작업을 동기화하는 데 사용될 수 있습니다.Named system mutexes are visible throughout the operating system and can be used to synchronize the activities of processes. 동일한 명명된 시스템 뮤텍스를 나타내는 여러 Mutex 개체를 만들 수 있으며 OpenExisting 메서드를 사용하여 기존 명명된 시스템 뮤텍스를 열 수 있습니다.You can create multiple Mutex objects that represent the same named system mutex, and you can use the OpenExisting method to open an existing named system mutex.

로컬 뮤텍스는 프로세스 내에만 존재합니다.A local mutex exists only within your process. 로컬 Mutex 개체에 대한 참조가 있는 프로세스의 모든 스레드에서 사용할 수 있습니다.It can be used by any thread in your process that has a reference to the local Mutex object. Mutex 개체는 별도 로컬 뮤텍스입니다.Each Mutex object is a separate local mutex.

시스템 뮤텍스에 대한 액세스 제어 보안Access Control Security for System Mutexes

.NET Framework 버전 2.0은 명명된 시스템 개체에 대해 Windows 액세스 제어 보안을 쿼리 및 설정하는 기능을 제공합니다.The .NET Framework version 2.0 provides the ability to query and set Windows access control security for named system objects. 시스템 개체는 전역적이며 따라서 코드에서 잠글 수 있으므로 생성 순간부터 시스템 뮤텍스를 보호하는 것이 좋습니다.Protecting system mutexes from the moment of creation is recommended because system objects are global and therefore can be locked by code other than your own.

뮤텍스의 액세스 제어 보안에 대한 자세한 내용은 MutexSecurityMutexAccessRule 클래스, MutexRights 열거형, Mutex 클래스의 GetAccessControl, SetAccessControlOpenExisting 메서드, Mutex(Boolean, String, Boolean, MutexSecurity) 생성자를 참조하세요.For information on access control security for mutexes, see the MutexSecurity and MutexAccessRule classes, the MutexRights enumeration, the GetAccessControl, SetAccessControl, and OpenExisting methods of the Mutex class, and the Mutex(Boolean, String, Boolean, MutexSecurity) constructor.

참고 항목See also