lierre

mfc createevent 예제

다음 예제에서는 뮤텍스를 대체하는 세마포를 보여 줍니다. 세마포는...

02 Août

다음 예제에서는 뮤텍스를 대체하는 세마포를 보여 줍니다. 세마포는 최대 값 1과 초기 값 1인 CreateSemaphore(0, 1, 1, 0)를 보유하도록 만들어집니다. 두 개의 스레드가 만들어지고 두 스레드가 동일한 코드를 실행하여 변수 수를 100으로 증가시입니다. 이 것의 최종 결과는 응용 프로그램이 끝날 때 변수 개수가 200을 포함한다는 것입니다. 다음 예제에서는 두 개의 스레드를 주문하기 위해 이벤트 개체를 사용하는 방법을 보여 줍니다. 이벤트 개체는 CreateEvent()를 호출하여 만들어집니다. 이 개체는 수동 재설정이 필요하며 신호가 없는 상태로 만들어집니다. 그런 다음 두 개의 스레드가 만들어집니다. 첫 번째 스레드는 루틴 myThreadA()를 실행하고 이벤트를 기다립니다.

두 번째 스레드는 메시지를 인쇄한 다음 이벤트 개체에 신호를 보내는 루틴 myThreadB()를 실행합니다. 신호를 사용하면 첫 번째 스레드가 실행을 계속한 다음 두 번째 메시지를 인쇄합니다. 응용 프로그램이 뮤텍스로 완료되면 CloseHandle()를 호출하여 커널 리소스를 해제해야 합니다. 다음 예제에서는 뮤텍스를 만들고 해제하는 프로세스를 보여 줍니다. 이것은 기본적으로 이미 만든 이벤트를 열고 5 초 동안 자고 후 수동으로 재설정합니다. CreateEvent를 사용하는 예제에서는 이벤트 개체 사용을 참조하세요. 응용 프로그램은 여러 상황에서 이벤트 개체를 사용하여 대기 스레드에 이벤트 발생을 알릴 수 있습니다. 예를 들어 파일, 명명된 파이프 및 통신 장치에서 중첩된 I/O 작업은 이벤트 개체를 사용하여 완료를 알리는 작업을 사용합니다. 중첩된 I/O 작업에서 이벤트 개체의 사용에 대한 자세한 내용은 동기화 및 겹친 입력 및 출력을 참조하십시오.

다중 스레드 응용 프로그램의 디버깅은 큰 주제이며이 자습서의 다른 장에서 제공됩니다. 그러나 이전 섹션의 동일한 예제를 사용하여 Visual Studio 2010을 사용하여 디버깅을 시작하는 방법을 간략하게 설명합니다. 다음 예제에서는 이벤트 개체를 사용하여 자식 스레드가 이벤트를 신호하는 방법을 보여 주 스레드에 대한 완료를 알려줍니다. 여러 스레드를 기다리는 주 스레드는 추가 실행하기 전에 모든 스레드가 완료되도록 합니다. 다음 예제에서는 이벤트 개체를 사용하여 마스터 스레드가 해당 버퍼에 쓰는 동안 여러 스레드가 공유 메모리 버퍼에서 읽지 못하도록 합니다. 먼저 마스터 스레드는 CreateEvent 함수를 사용하여 초기 상태가 신호가 없는 수동 재설정 이벤트 개체를 만듭니다. 그런 다음 여러 판독기 스레드를 만듭니다. 마스터 스레드는 쓰기 작업을 수행한 다음 쓰기가 완료되면 이벤트 개체를 신호 상태로 설정합니다. 다음 예제에서는 카운터 변수에 대한 액세스를 보호하기 위해 임계 섹션을 사용하는 방법을 보여 줍니다. 그러나 두 스레드를 사용하면 두 스레드가 동시에 변수 카운터에 액세스하는 경우 데이터 경합이 발생합니다. 따라서 데이터 경합을 피하기 위해 카운터의 증분을 보호해야 할 수도 있습니다.

다음 섹션에서는 스레드 디버깅을 간략하게 설명한 후 이 문제를 해결하기 위한 몇 가지 방법을 살펴보겠습니다. 따라서 카운터 변수에 대한 액세스를 보호하는 코드는 아래 예제와 같이 TryEnterCriticalSection()를 사용하여 작성할 수 있습니다. 예제는 스레드의 생산자-소비자 쌍을 중재하기 위해 조건 변수의 사용을 보여 줍니다.