다음을 통해 공유


다중 스레딩: MFC 동기화 클래스를 사용하는 경우

MFC와 함께 제공되는 다중 스레드 클래스는 동기화 개체(CSyncObject, CSemaphore, CMutex, CCriticalSection 및 CEvent) 및 동기화 액세스 개체(CMultiLockCSingleLock)의 두 가지 범주로 구분됩니다.

동기화 클래스는 리소스의 무결성을 보장하기 위해 리소스에 대한 액세스를 제어해야 하는 경우에 사용됩니다. 동기화 액세스 클래스는 이러한 제어된 리소스에 대한 액세스 권한을 얻는 데 사용됩니다. 이 항목에서는 각 클래스를 사용해야 하는 경우에 대해 설명합니다.

사용해야 하는 동기화 클래스를 확인하려면 다음 일련의 질문을 합니다.

  1. 애플리케이션이 리소스에 액세스하기 전에 어떤 일이 발생할 때까지 기다려야 하나요(예: 파일에 기록하기 전에 통신 포트에서 데이터를 받아야 하나요).

    그렇다면 다음을 사용합니다 CEvent.

  2. 동일한 애플리케이션 내의 두 개 이상의 스레드가 한 번에 이 리소스에 액세스할 수 있나요(예: 애플리케이션에서 동일한 문서에 대한 보기가 있는 최대 5개의 창을 허용)?

    그렇다면 다음을 사용합니다 CSemaphore.

  3. 둘 이상의 애플리케이션에서 이 리소스를 사용할 수 있나요(예: 리소스가 DLL에 있는 경우)?

    그렇다면 다음을 사용합니다 CMutex.

    아니요인 경우 .를 사용합니다 CCriticalSection.

CSyncObject 는 직접 사용되지 않습니다. 다른 4개의 동기화 클래스에 대한 기본 클래스입니다.

예제 1: 세 개의 동기화 클래스 사용

예를 들어 연결된 계정 목록을 유지하는 애플리케이션을 사용합니다. 이 애플리케이션을 사용하면 별도의 창에서 최대 3개의 계정을 검사할 수 있지만 특정 시간에는 하나만 업데이트할 수 있습니다. 계정이 업데이트되면 업데이트된 데이터가 네트워크를 통해 데이터 보관으로 전송됩니다.

이 예제 애플리케이션은 세 가지 유형의 동기화 클래스를 모두 사용합니다. 한 번에 최대 3개의 계정을 검사할 수 있으므로 세 개의 뷰 개체에 대한 액세스를 제한하는 데 사용합니다 CSemaphore . 네 번째 계정을 보려는 시도가 발생하면 애플리케이션은 처음 세 창 중 하나가 닫히거나 실패할 때까지 기다립니다. 계정이 업데이트되면 애플리케이션은 한 번에 하나의 계정만 업데이트되도록 하는 데 사용합니다 CCriticalSection . 업데이트가 성공하면 신호를 표시 CEvent합니다. 그러면 이벤트가 신호를 받을 때까지 기다리는 스레드가 해제됩니다. 이 스레드는 새 데이터를 데이터 보관 파일로 보냅니다.

예제 2: 동기화 액세스 클래스 사용

사용할 동기화 액세스 클래스를 선택하는 것이 더 간단합니다. 애플리케이션이 제어되는 단일 리소스에만 액세스하는 데 관심이 있는 경우 .CSingleLock 제어된 여러 리소스 CMultiLock중 하나에 액세스해야 하는 경우 . 예제 1 CSingleLock 에서는 각 경우에 특정 시간에 하나의 리소스만 필요하기 때문에 사용되었을 것입니다.

동기화 클래스를 사용하는 방법에 대한 자세한 내용은 다중 스레딩: 동기화 클래스를 사용하는 방법을 참조하세요. 동기화에 대한 자세한 내용은 Windows SDK의 동기화를 참조하세요. MFC의 다중 스레딩 지원에 대한 자세한 내용은 C++ 및 MFC를 사용한 다중 스레딩을 참조하세요.

참고 항목

C++ 및 MFC에서 다중 스레딩