mfc mutex 예제

이러한 방식으로 CMutex 개체에 의해 제어되는 리소스에 액세스하려면 먼저 리소스의 액세스 멤버 함수에서 CSingleLock 또는 CMultiLock 형식의 변수를 만듭니다. 그런 다음 잠금 개체의 Lock 멤버 함수(예: CSingleLock::Lock)를 호출합니다. 이 시점에서 스레드는 리소스에 대한 액세스 권한을 얻거나, 리소스가 해제될 때까지 기다렸다가 액세스 권한을 얻거나, 리소스가 해제되고 시간 시간이 지나갈 때까지 기다리며 리소스에 대한 액세스 권한을 얻지 못합니다. 어쨌든 리소스는 스레드에서 안전한 방식으로 액세스되었습니다. 리소스를 해제하려면 잠금 개체의 잠금 해제 멤버 함수(예: CSingleLock::Unlock)를 사용하거나 잠금 개체가 범위를 벗어나도록 허용합니다. 임계 섹션(참조도 참조)은 단일 스레드만 코드 영역을 실행하도록 하는 방법입니다. 프로세스 내에서 선언되며 커널에서 제공하는 리소스가 아닙니다. 즉, 임계 섹션은 동일한 프로세스에서 스레드를 동기화하는 데만 사용할 수 있는 잠금 개체이며 핸들이 없습니다. 프로세스 내에 있기 때문에 커널에 의해 액세스를 중개해야 하는 경우보다 중요한 섹션에 대한 액세스가 더 빠를 수 있습니다. 이것은 defferences 중 하나입니다: 중요 한 섹션 커널 수준으로 이동 하지 않습니다., 하지만 뮤 텍스 커널 수준으로 이동 않습니다. 다음 예제에서는 CreateMutex 함수를 사용하여 뮤텍스 개체를 만들고 CreateThread 함수를 만들어 작업자 스레드를 만듭니다. 이 예제에서는 구조화 된 예외 처리를 사용 하 여 스레드가 mutex 개체를 제대로 해제 합니다. __finally 코드 블록은 __try 블록이 종료되는 방식에 관계없이 실행됩니다(__try 블록에 TerminateThread 함수에 대한 호출이 포함되어 있지 않은 경우).

이렇게 하면 뮤텍스 개체가 실수로 포기되는 것을 방지할 수 있습니다. 뮤텍스 사양의 일부는 뮤텍스를 소유한 동일한 스레드에 의해 재귀적으로 획득할 수 있다는 것입니다. 당신은 당신이 할만큼 ::ReleaseMutex를 수행해야합니다 ::WaitFor 뮤텍스에. 즉, 이벤트는 하나 이상의 스레드에 이벤트가 발생했음을 알리는 데 사용됩니다. 세마포, 뮤텍스 또는 조건 변수를 사용하여 동일한 작업을 수행할 수 있습니다. 뮤텍스는 CreateMutex() 또는 CreateMutexEx()를 호출하여 만들어집니다. 호출은 핸들을 새로 만든 뮤텍스 개체로 반환합니다. 이는 m_bAcquired 변수에 의미가 있으며 둘 이상의 스레드에서 액세스되지 않는다고 잘못 가정합니다. 와우! 여기에 두 개 이상의 스레드에서 실행되지 않는 경우에만 올바른 스레드 간 동기화 프리미티브가 있습니다! 내가 여기에 뭔가를 놓친? 그리고, 그냥 혼란에 추가하려면, 뮤텍스가 성공적으로 한 번 출시되면, 그것은 다시 출시되지 않습니다! 원시 기본을 사용하는 경우 다음 코드가 작동합니다: 다음 예제에서는 지정된 범위의 모든 소수를 계산하는 데 두 개의 스레드가 사용됩니다. 임계 섹션은 스레드 동기화 개체입니다. 세마포, 이벤트 및 뮤텍스와 같은 다른 동기화 개체는 리소스를 다른 프로세스와 동기화하는 데 사용됩니다.

그러나 중요한 섹션은 동일한 프로세스 내에서 동기화를 허용합니다. 다음 예제에서는 카운터 변수에 대 한 액세스를 보호 하기 위해 중요 한 섹션을 사용 하는 방법을 보여 줍니다. 일반적으로 뮤텍스는 스레드 간의 상호 제외를 협상 하는 프로그램 개체에 대 한 일반적인 이름(lock이라고도 함).

Comments are closed.