Search
Duplicate
🏆

커널 객체를 이용한 쓰래드 동기화(5) - 뮤텍스

Category
S/W 엔지니어
Tags
C++
Programming Applications for Microsoft Windows
thread synchronization
쓰래드 동기화
Created time
2004/10/27
제프리 릭터의 Programming Applications for Microsoft Windows. (4th Editon) 에 담긴 내용입니다.
뮤텍스(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++
복사