CMutex 클래스
한 스레드가 리소스에 대해 상호 배타적으로 액세스할 수 있도록 하는 동기화 개체인 "뮤텍스"를 나타냅니다.
구문
class CMutex : public CSyncObject
멤버
공용 생성자
속성 | 설명 |
---|---|
CMutex::CMutex | CMutex 개체를 생성합니다. |
설명
뮤텍스는 한 번에 하나의 스레드만 데이터 또는 다른 제어된 리소스를 수정하도록 허용할 수 있는 경우에 유용합니다. 예를 들어 연결된 목록에 노드를 추가하는 것은 한 번에 하나의 스레드에서만 허용해야 하는 프로세스입니다. 개체를 CMutex
사용하여 연결된 목록을 제어하면 한 번에 하나의 스레드만 목록에 액세스할 수 있습니다.
개체를 CMutex
사용하려면 필요할 때 개체를 CMutex
생성합니다. 대기하려는 뮤텍스의 이름과 애플리케이션이 처음에 소유해야 하는 뮤텍스의 이름을 지정합니다. 그런 다음 생성자가 반환되면 뮤텍스에 액세스할 수 있습니다. 제어된 리소스에 대한 액세스가 완료되면 CSyncObject::Unlock를 호출합니다.
개체를 사용하는 CMutex
다른 방법은 제어하려는 클래스에 형식 CMutex
변수를 데이터 멤버로 추가하는 것입니다. 제어된 개체를 생성하는 동안 뮤텍스가 CMutex
처음 소유되는지, 뮤텍스의 이름(프로세스 경계를 넘어 사용될 경우) 및 원하는 보안 특성을 지정하는 데이터 멤버의 생성자를 호출합니다.
이러한 방식으로 개체에 의해 제어되는 리소스에 CMutex
액세스하려면 먼저 리소스의 액세스 멤버 함수에 CSingleLock 형식 또는 CMultiLock 형식의 변수를 만듭니다. 그런 다음 잠금 개체의 Lock
멤버 함수(예: CSingleLock::Lock)를 호출합니다. 이 시점에서 스레드는 리소스에 대한 액세스 권한을 얻거나, 리소스가 해제될 때까지 기다렸다가 액세스 권한을 얻거나, 리소스가 해제되고 시간이 초과될 때까지 기다리며 리소스에 대한 액세스 권한을 얻지 않습니다. 어떤 경우든 리소스가 스레드로부터 안전한 방식으로 액세스되었습니다. 리소스를 해제하려면 잠금 개체의 Unlock
멤버 함수(예: CSingleLock::Unlock)를 사용하거나 잠금 개체가 범위를 벗어나도록 허용합니다.
개체 사용에 CMutex
대한 자세한 내용은 다중 스레딩: 동기화 클래스를 사용하는 방법 문서를 참조하세요.
상속 계층 구조
CMutex
요구 사항
헤더: afxmt.h
CMutex::CMutex
명명되거나 명명되지 않은 개체를 CMutex
생성합니다.
CMutex(
BOOL bInitiallyOwn = FALSE,
LPCTSTR lpszName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);
매개 변수
bInitiallyOwn
개체를 만드는 CMutex
스레드가 처음에 뮤텍스에 의해 제어되는 리소스에 액세스할 수 있는지를 지정합니다.
lpszName
CMutex
개체의 이름입니다. 이름이 같은 다른 뮤텍스가 있는 경우 개체가 프로세스 경계를 넘어 사용될 경우 lpszName 을 제공해야 합니다. NULL이면 뮤텍스는 이름이 지정되지 않습니다. 이름이 기존 뮤텍스와 일치하는 경우 생성자는 해당 이름의 뮤텍스를 참조하는 새 CMutex
개체를 빌드합니다. 이름이 뮤텍스가 아닌 기존 동기화 개체와 일치하면 생성에 실패합니다.
lpsaAttribute
뮤텍스 개체의 보안 특성입니다. 이 구조에 대한 전체 설명은 Windows SDK의 SECURITY_ATTRIBUTES 참조하세요.
설명
개체에 CMutex
액세스하거나 해제하려면 CMultiLock 또는 CSingleLock 개체를 만들고 해당 Lock and Unlock 멤버 함수를 호출합니다. 개체가 CMutex
독립 실행형으로 사용되는 경우 해당 멤버 함수를 Unlock
호출하여 해제합니다.
Important
개체를 CMutex
만든 후 GetLastError를 사용하여 뮤텍스가 아직 없는지 확인합니다. 뮤텍스가 예기치 않게 존재했다면 불량 프로세스가 웅크리고 있음을 나타낼 수 있으며 뮤텍스를 악의적으로 사용하려고 할 수 있습니다. 이 경우 권장되는 보안 의식 프로시저는 핸들을 닫고 개체를 만드는 데 오류가 있는 것처럼 계속 진행하는 것입니다.