여러 스레드의 실행 동기화
경합 상태 및 교착 상태를 방지하려면 여러 스레드의 액세스를 공유 리소스에 동기화해야 합니다. 상호 종속 코드가 적절한 순서로 실행되도록 하려면 동기화도 필요합니다.
여러 스레드를 동기화하는 데 핸들을 사용할 수 있는 개체가 많이 있습니다. 이러한 개체는 다음과 같습니다.
- 콘솔 입력 버퍼
- 이벤트
- 뮤텍스
- 프로세스
- 세마포
- 스레드
- 타이머
이러한 각 개체의 상태는 신호를 받거나 신호를 받지 않습니다. 대기 함수 중 하나에 대한 호출에서 이러한 개체에 대한 핸들을 지정하면 지정된 개체의 상태가 신호를 보낼 때까지 호출 스레드의 실행이 차단됩니다.
이러한 개체 중 일부는 일부 이벤트가 발생할 때까지 스레드를 차단하는 데 유용합니다. 예를 들어 키 입력 또는 마우스 단추 클릭과 같은 읽지 않은 입력이 있을 때 콘솔 입력 버퍼 핸들이 신호를 보냅니다. 프로세스 및 스레드 핸들은 프로세스 또는 스레드가 종료될 때 신호를 보냅니다. 예를 들어 프로세스에서 자식 프로세스를 만든 다음 새 프로세스가 종료될 때까지 자체 실행을 차단할 수 있습니다.
다른 개체는 동시 액세스로부터 공유 리소스를 보호하는 데 유용합니다. 예를 들어 여러 스레드는 각각 뮤텍스 개체에 대한 핸들을 가질 수 있습니다. 공유 리소스에 액세스하기 전에 스레드는 대기 함수 중 하나를 호출하여 뮤텍스 상태가 신호를 받을 때까지 기다려야 합니다. 뮤텍스가 신호를 받으면 리소스에 액세스하기 위해 대기 중인 스레드가 하나만 해제됩니다. 다른 대기 스레드가 차단된 상태로 유지되도록 뮤텍스의 상태가 즉시 신호되지 않도록 다시 설정됩니다. 스레드가 리소스로 완료되면 다른 스레드가 리소스에 액세스할 수 있도록 뮤텍스의 상태를 신호로 설정해야 합니다.
단일 프로세스의 스레드에 대해 중요한 섹션 개체는 뮤텍스보다 더 효율적인 동기화 수단을 제공합니다. 중요한 섹션은 한 번에 하나의 스레드가 보호된 리소스를 사용할 수 있도록 뮤텍스처럼 사용됩니다. 스레드는 EnterCriticalSection 함수를 사용하여 중요한 섹션의 소유권을 요청할 수 있습니다. 이미 다른 스레드가 소유하고 있는 경우 요청 스레드가 차단됩니다. 스레드는 TryEnterCriticalSection 함수를 사용하여 중요한 섹션을 가져오지 못한 경우 차단하지 않고 중요한 섹션의 소유권을 요청할 수 있습니다. 소유권을 받으면 스레드는 보호된 리소스를 자유롭게 사용할 수 있습니다. 프로세스의 다른 스레드 실행은 동일한 중요 섹션을 입력하려고 시도하지 않는 한 영향을 받지 않습니다.
WaitForInputIdle 함수는 지정된 프로세스가 초기화되고 입력이 보류되지 않은 사용자 입력을 대기할 때까지 스레드 대기를 만듭니다. WaitForInputIdle을 호출하면 부모 및 자식 프로세스를 동기화하는 데 유용할 수 있습니다. CreateProcess는 자식 프로세스가 초기화를 완료할 때까지 기다리지 않고 반환되기 때문입니다.
자세한 내용은 동기화를 참조 하세요.