다중 스레딩: MFC 동기화 클래스를 사용하는 경우
MFC와 함께 제공되는 다중 스레드 클래스는 동기화 개체(CSyncObject, CSemaphore, CMutex, CCriticalSection 및 CEvent) 및 동기화 액세스 개체(CMultiLock 및 CSingleLock)의 두 가지 범주로 구분됩니다.
동기화 클래스는 리소스의 무결성을 보장하기 위해 리소스에 대한 액세스를 제어해야 하는 경우에 사용됩니다. 동기화 액세스 클래스는 이러한 제어된 리소스에 대한 액세스 권한을 얻는 데 사용됩니다. 이 항목에서는 각 클래스를 사용해야 하는 경우에 대해 설명합니다.
사용해야 하는 동기화 클래스를 확인하려면 다음 일련의 질문을 합니다.
애플리케이션이 리소스에 액세스하기 전에 어떤 일이 발생할 때까지 기다려야 하나요(예: 파일에 기록하기 전에 통신 포트에서 데이터를 받아야 하나요).
그렇다면 다음을 사용합니다
CEvent
.동일한 애플리케이션 내의 두 개 이상의 스레드가 한 번에 이 리소스에 액세스할 수 있나요(예: 애플리케이션에서 동일한 문서에 대한 보기가 있는 최대 5개의 창을 허용)?
그렇다면 다음을 사용합니다
CSemaphore
.둘 이상의 애플리케이션에서 이 리소스를 사용할 수 있나요(예: 리소스가 DLL에 있는 경우)?
그렇다면 다음을 사용합니다
CMutex
.아니요인 경우 .를 사용합니다
CCriticalSection
.
CSyncObject
는 직접 사용되지 않습니다. 다른 4개의 동기화 클래스에 대한 기본 클래스입니다.
예제 1: 세 개의 동기화 클래스 사용
예를 들어 연결된 계정 목록을 기본 애플리케이션을 사용합니다. 이 애플리케이션을 사용하면 별도의 창에서 최대 3개의 계정을 검사할 수 있지만 특정 시간에는 하나만 업데이트할 수 있습니다. 계정이 업데이트되면 업데이트된 데이터가 네트워크를 통해 데이터 보관으로 전송됩니다.
이 예제 애플리케이션은 세 가지 유형의 동기화 클래스를 모두 사용합니다. 한 번에 최대 3개의 계정을 검사할 수 있으므로 세 개의 뷰 개체에 대한 액세스를 제한하는 데 사용합니다 CSemaphore
. 네 번째 계정을 보려는 시도가 발생하면 애플리케이션은 처음 세 창 중 하나가 닫히거나 실패할 때까지 기다립니다. 계정이 업데이트되면 애플리케이션은 한 번에 하나의 계정만 업데이트되도록 하는 데 사용합니다 CCriticalSection
. 업데이트가 성공하면 신호를 표시 CEvent
합니다. 그러면 이벤트가 신호를 받을 때까지 기다리는 스레드가 해제됩니다. 이 스레드는 새 데이터를 데이터 보관 파일로 보냅니다.
예제 2: 동기화 액세스 클래스 사용
사용할 동기화 액세스 클래스를 선택하는 것이 더 간단합니다. 애플리케이션이 제어되는 단일 리소스에만 액세스하는 데 관심이 있는 경우 .CSingleLock
제어된 여러 리소스 CMultiLock
중 하나에 액세스해야 하는 경우 . 예제 1 CSingleLock
에서는 각 경우에 특정 시간에 하나의 리소스만 필요하기 때문에 사용되었을 것입니다.
동기화 클래스를 사용하는 방법에 대한 자세한 내용은 다중 스레딩: 동기화 클래스를 사용하는 방법을 참조하세요. 동기화에 대한 자세한 내용은 Windows SDK의 동기화를 참조하세요. MFC의 다중 스레딩 지원에 대한 자세한 내용은 C++ 및 MFC를 사용한 다중 스레딩을 참조하세요.