mfc thread 동기화 예제

스레드가 g_nVariable 변수에 대한 독점 액세스 권한이 없기 때문에 안전한 코드가 아닙니다. 다음 시나리오를 고려하십시오. g_nVariable의 초기 값이 80이라고 가정하면 컨트롤은 g_nVariable 값이 100보다 적으므로 조건하에서 블록을 실행하려고 시도하는 첫 번째 스레드로 전달됩니다. 그러나 그 때 프로세서는 변수에 50을 추가하는 두 번째 스레드로 전환하므로 100보다 커집니다. 그런 다음 프로세서가 첫 번째 스레드로 다시 전환하고 if 블록을 계속 실행합니다. 어떨까요? if 블록 내부에서 g_nVariable값은 100보다 크지만 100보다 큽합니다. 이러한 격차를 해소하기 위해 스레드 동기화는 다중 스레드 환경에서 공유 리소스에 액세스하는 데 사용됩니다. 프로그래머는 동기화 개체를 효율적으로 사용할 시기를 결정합니다. MFC 스레드 동기화 클래스는 내부적으로 Win32 API 함수를 호출합니다. MFC 스레드 동기화 클래스는 Windows 환경을 형성하는 많은 기능을 래핑합니다. 스레드가 공유 리소스에 액세스하는 즉시 세마포의 카운터 변수가 하나씩 감소됩니다. 0이 되면 리소스를 캡처한 스레드가 하나 이상 남을 때까지 리소스사용 시도가 거부됩니다(즉, 세마포를 해제). 우리는 세마포를 기다리거나 캡처 / 해제하기 위해 CSingleLock 및 / 또는 CMultiLock 클래스로 전환 할 수 있습니다.

아래와 같이 API 함수를 사용할 수도 있습니다: 스레드는 슬림 한 판독기 /기록기 잠금을 획득한 다음 SleepConditionVariableSRW ()를 호출하거나 중요한 섹션을 입력하고 SleepConditionVariableCS ()를 호출하여 조건 변수를 사용합니다. 절전 호출에서 스레드가 깨어나면 조건 변수가 사용되는 방식에 따라 임계 섹션 잠금 또는 판독기/기록기 잠금을 다시 획득하게 됩니다. 스레드가 수행해야 하는 첫 번째 일은 조건이 false가 될 때 스레드가 작업자가 될 수 있기 때문에 대기 중인 조건이 true인지 여부를 테스트하는 것입니다. 조건이 충족되지 않은 경우 스레드는 조건 변수에 대해 절전 모드로 돌아와야 합니다. 보호할 공유 리소스가 두 개 이상 있는 경우 리소스당 별도의 중요 섹션을 사용하는 것이 좋습니다. 각 잠금에 잠금 해제를 일치하는 것을 잊지 마십시오. 중요한 섹션을 사용할 때는 스레드 를 공동 작업하기 위해 상호 차단 상황을 준비하지 않도록 주의해야 합니다. 즉, 스레드는 다른 스레드에서 임계 섹션이 해제될 때까지 기다릴 수 있으며, 이 섹션은 첫 번째 스레드에서 캡처된 임계 섹션을 기다립니다. 이러한 경우 두 스레드가 영원히 기다릴 것이 분명합니다.