mfc 크리티컬 섹션 예제

다른 동기화 개체 이름이 임계 단면 개체와 같으면 임계 섹션 개체가 소유권을 무한히 기다립니다. 임계 단면 오브젝트는 객체를 이동하거나 복사할 수 없습니다. 다른 프로세스에서 스레드를 동기화해야 하는 경우 Mutex 개체를 사용합니다. 삭제CriticalSection 함수는 모든 임계 섹션 개체를 해제합니다. 삭제 임계 섹션을 호출 한 후 EnterCriticalsection 또는 LeaveCriticalSection을 호출할 수 없습니다. 여기서 lpCriticalSection [in, out]은 임계 섹션 개체에 대한 포인터입니다. Windows에는 사고를 효과적으로 방지하는 데 사용할 수 있는 여러 동기화 개체가 있습니다. MFC는 이를 CEvent, CCriticalSection, CMutex 및 Csemaphore로 캡슐화합니다. 이를 사용하려면 프로젝트에 afxmt.hin을 포함하십시오. [코드 랭=”cpp”] C임계 섹션 cs; …

Cs. 잠금(); 문자열배열.DoSomething(); Cs. 잠금 해제(); [/코드] 해당 개체를 사용하는 모든 스레드에서 이 작업을 수행합니다. 동일한 개체를 잠그려면 동일한 임계 섹션 변수를 사용해야 합니다. 스레드가 이미 잠긴 개체를 잠그려고 하면 개체에 안전하게 액세스할 수 있도록 잠금이 해제될 때까지 그냥 대기하고 있습니다. CMutex Embedded 메서드 클래스에 CCriticalSection 형식 데이터 멤버를 추가 하 고 필요할 때 데이터 멤버를 잠그면 여러 스레드와 클래스를 공유할 수도 있습니다. 임계 섹션 및 CriticalSectionLock 클래스에 대한 자세한 내용은 SimbaEngine C++ API 참조를 참조하십시오. 따라서 카운터 변수에 대한 액세스를 보호하는 코드는 아래 예제와 같이 TryEnterCriticalSection()을 사용하여 작성할 수 있습니다. 임계 섹션 대신 뮤텍스를 사용할 수 있습니다. 그러나 중요한 섹션 스레드 동기화 개체는 다른 동기화 개체에 비해 약간 빠릅니다. 임계 섹션 개체는 프로세스 내의 스레드를 동기화합니다. 임계 섹션에서는 한 번에 하나의 스레드만 액세스할 수 있습니다.

코드의 중요한 섹션은 CriticalSection 개체를 사용하여 구체적이어야 합니다. 그런 다음 CriticalSectionLock 개체를 사용하여 이 임계 섹션을 잠그어 다른 스레드의 동시 액세스를 방지할 수 있습니다. 중요한 부분은 잠들기 전에 짧은 시간 동안 회전하는 이 아이디어를 지원합니다. EnterCriticalSection()를 호출하는 스레드가 절전 모드로 이동하기 전에 회전하는 횟수를 설정하는 방법에는 두 가지가 있습니다. 임계 섹션은 임계 섹션에 대한 포인터를 취하고 스핀 수를 매개 변수로 하는 InitializeCriticalSectionAndSpinCount()라는 호출을 통해 값으로 초기화할 수 있습니다. 또는 임계 섹션이 만들어지면 SetCriticalSectionSpinCount() 호출을 통해 스핀 수를 설정할 수 있습니다: 시간 대기가 필요한 경우 CCriticalSection 개체 대신 CMutex 개체를 사용할 수 있습니다. 응용 프로그램은 뮤텍스를 획득하기 위해 WaitForSingleObject()를 호출해야 합니다. 함수는 획득한 뮤텍스와 함께 반환되거나 지정된 시간 시간 이후에 반환됩니다. 스레드가 완료되면 뮤텍스에 의해 보호되는 코드 섹션을 ReleaseMutex()를 호출하여 해제할 수 있습니다. WaitForSingleObject() 및 ReleaseMutex() 작업은 각각 EnterCriticalSection() 및 LeaveCriticalSection()과 유사합니다. 다음 코드는 속도가 중요하고 리소스가 프로세스 경계를 넘어 사용되지 않을 때 뮤텍스 대신 중요한 섹션이 사용되는 방법을 보여 주었습니다( CMutex 참조).

This entry was posted in Uncategorized by admin. Bookmark the permalink.

Comments are closed.