뮤텍스 개체

뮤텍스 개체는 스레드가 소유하지 않을 때 상태가 신호로 설정되고 소유될 때 서명되지 않은 상태로 설정된 동기화 개체입니다. 한 번에 하나의 스레드만 뮤텍스 개체를 소유할 수 있습니다. 이 개체의 이름은 공유 리소스에 대한 상호 배타적 액세스를 조정하는 데 유용하다는 사실에서 비롯됩니다. 예를 들어 두 스레드가 공유 메모리에 동시에 쓰지 못하도록 하기 위해 각 스레드는 메모리에 액세스하는 코드를 실행하기 전에 뮤텍스 개체의 소유권을 기다립니다. 공유 메모리에 쓴 후 스레드는 뮤텍스 개체를 해제합니다.

스레드는 CreateMutex 또는 CreateMutexEx 함수를 사용하여 뮤텍스 개체를 만듭니다. 만드는 스레드는 뮤텍스 개체의 즉각적인 소유권을 요청할 수 있으며 뮤텍스 개체의 이름을 지정할 수도 있습니다. 명명되지 않은 뮤텍스를 만들 수도 있습니다. 뮤텍스, 이벤트, 세마포 및 타이머 개체의 이름에 대한 자세한 내용은 Interprocess Synchronization을 참조하세요.

다른 프로세스의 스레드는 OpenMutex 함수 호출에서 이름을 지정하여 기존 명명된 뮤텍스 개체에 대한 핸들을 열 수 있습니다. 명명되지 않은 뮤텍스에 핸들을 다른 프로세스에 전달하려면 DuplicateHandle 함수 또는 부모-자식 핸들 상속을 사용합니다.

뮤텍스 개체에 대한 핸들이 있는 스레드는 대기 함수 중 하나를 사용하여 뮤텍스 개체의 소유권을 요청할 수 있습니다. 뮤텍스 개체가 다른 스레드에서 소유하는 경우 대기 함수는 소유 스레드가 ReleaseMutex 함수를 사용하여 뮤텍스 개체를 해제할 때까지 요청 스레드를 차단합니다. 대기 함수의 반환 값은 함수가 신호로 설정되는 뮤텍스의 상태 이외의 이유로 반환되는지 여부를 나타냅니다.

둘 이상의 스레드가 뮤텍스에서 대기 중인 경우 대기 스레드가 선택됩니다. FIFO(선점) 순서를 가정하지 마세요. 커널 모드 APC와 같은 외부 이벤트는 대기 순서를 변경할 수 있습니다.

스레드가 뮤텍스의 소유권을 얻은 후 실행을 차단하지 않고 대기 함수 에 대한 반복 호출에서 동일한 뮤텍스를 지정할 수 있습니다. 이렇게 하면 이미 소유하고 있는 뮤텍스를 기다리는 동안 스레드가 교착 상태가 발생하지 않습니다. 이러한 상황에서 소유권을 해제하려면 스레드는 뮤텍스가 대기 함수의 조건을 충족할 때마다 ReleaseMutex 를 한 번 호출해야 합니다.

스레드가 뮤텍스 개체의 소유권을 해제하지 않고 종료되면 뮤텍스 개체는 중단된 것으로 간주됩니다. 대기 스레드는 중단된 뮤텍스 개체의 소유권을 획득할 수 있지만 대기 함수는 WAIT_ABANDONED 반환하여 뮤텍스 개체가 중단되었음을 나타냅니다. 중단된 뮤텍스 개체는 오류가 발생했으며 뮤텍스 개체로 보호되는 공유 리소스가 정의되지 않은 상태임을 나타냅니다. 뮤텍스 개체가 중단되지 않은 것처럼 스레드가 진행되면 스레드가 소유권을 해제한 후 더 이상 중단된 것으로 간주되지 않습니다. 이후 대기 함수에서 뮤텍스 개체에 대한 핸들을 지정하면 정상적인 동작이 복원됩니다.

중요한 섹션 개체는 단일 프로세스의 스레드에서만 사용할 수 있다는 점을 제외하고 뮤텍스 개체에서 제공하는 것과 유사한 동기화를 제공합니다.

뮤텍스 개체 사용