•
뮤텍스(Mutex) 커널 객체: 사용 카운트, 쓰래드 ID, 재귀 카운트(현재 뮤텍스를 소유하는 쓰래드가 몇번 소유하고 있는지를 나타냄)로 구성된다. 쓰래드로 하여금 단일 리소스에 독점적으로(mutualexclusive) 접근할 수 있도록 보장한다. 그러므로 사용자 모드 객체인 크리티컬 섹션(critical section)과 동일하게 동작하더라.. 하지만 뮤텍스는 커널 객체이므로, 크리티컬 섹션보다 느리다. 이 말은 단일 뮤텍스에 서로 다른 프로세스의 쓰래드가 접근할 수 있고, 리소스를 얻기위한 쓰래드 대기 시간 값을 지정할 수 있다는 뜻이다. 가장 많이 사용되는 커널 객체이기도 하며, 보통 여러 쓰래드에서 접근하는 메모리 블록을 보호하는 데 사용된다.
•
뮤텍스가 따르는 규칙
◦
쓰래드 ID가 0이면, 뮤텍스는 어떤 쓰래드에도 소유된 것이 아니며, 신호 상태이다.쓰래드 ID가 0이 아니면, 어떤 쓰래드가 소유하고 있는 것이며, 비신호 상태이다.
◦
다른 커널 객체와는 달리, 일반 규칙에 반하는 것을 허용하는 특별한 코드가 OS 내에 존재한다.뮤텍스 vs 크리티컬 섹션
•
성능
◦
뮤텍스: 느리다 / 크리티컬 섹션: 빠르다
•
프로세스 영역을 넘어 사용 가능한지
◦
뮤텍스: 가능 / 크리티컬 섹션: 불가
•
임의 시간 대기
◦
뮤텍스: WaitForSingleObject(hmtx, dwMilliSeconds); / 크리티컬 섹션: 불가
•
다른 커널 객체와 함께 대기 상태가 가능한지
◦
뮤텍스: 가능(WaitForMultipleObjects()나 이와 비슷한 함수를 통해) / 크리티컬 섹션: 불가
HANDLE CreateMutex (
PSECURITY_ATTRIBUTES psa,
BOOL fInitialOwner,
PCTSTR pszName );
fInitialOwner : 초기 상태 설정 값. FALSE가 넘어올 경우, 뮤텍스의 쓰래드 ID와 재귀 카운터가 0으로 설정된다. 이 말은 뮤텍스가 비소유 상태가 되고, 따라서 신호 상태로 된다는 뜻이다. TRUE가 넘어올 경우에는 뮤텍스 쓰래드 ID가 호출자 쓰래드의 ID로 설정되고, 재귀 카운터는 1로 설정된다. 따라서 비신호 상태가 된다.
HANDLE OpenMutex (
DWORD fdwAccess,
BOOL bInheritHandle,
PCTSTR pszName );
//뮤텍스의 재귀 카운트를 1만큼 감소시킨다. 재귀 카운터가 0이되면
//쓰래드 ID도 0으로 설정 되고, 뮤텍스는 신호 상태가 된다.
BOOL ReleaseMutex ( HANDLE hMutex );
C++
복사