중요 섹션 개체

중요한 섹션 개체는 단일 프로세스의 스레드에서만 중요한 섹션을 사용할 수 있다는 점을 제외하고 뮤텍스 개체에서 제공하는 것과 유사한 동기화를 제공합니다. 중요한 섹션 개체는 프로세스 간에 공유할 수 없습니다.

이벤트, 뮤텍스 및 세마포 개체는 단일 프로세스 애플리케이션에서도 사용할 수 있지만 중요한 섹션 개체는 상호 배제 동기화(프로세서별 테스트 및 설정 명령)를 위해 약간 더 빠르고 효율적인 메커니즘을 제공합니다. 뮤텍스 개체와 마찬가지로 중요한 섹션 개체는 한 번에 하나의 스레드에서만 소유할 수 있으므로 공유 리소스를 동시 액세스로부터 보호하는 데 유용합니다. 뮤텍스 개체와 달리 중요한 섹션이 중단되었는지 여부를 알 수 있는 방법은 없습니다.

Windows Server 2003 SP1(서비스 팩 1)부터 중요한 섹션에서 대기하는 스레드는 선착순으로 중요한 섹션을 획득하지 않습니다. 이렇게 변경하면 대부분의 코드에서 성능이 크게 향상됩니다. 그러나 일부 애플리케이션은 FIFO(선점) 순서에 따라 달라지며 현재 버전의 Windows에서 성능이 저하되거나 전혀 수행되지 않을 수 있습니다(예: 중요한 섹션을 속도 제한기로 사용한 애플리케이션). 코드가 계속 올바르게 작동하도록 하려면 동기화 수준을 더 추가해야 할 수 있습니다. 예를 들어 중요한 섹션 개체를 사용하여 작업을 동기화하는 생산자 스레드와 소비자 스레드가 있다고 가정합니다. 다른 스레드가 진행할 준비가 되었음을 알리는 데 사용할 각 스레드에 대해 하나씩 두 개의 이벤트 개체를 만듭니다. 소비자 스레드는 중요 섹션에 들어가기 전에 생산자가 이벤트를 신호할 때까지 대기하고, 생산자 스레드는 소비자 스레드가 위험 섹션에 들어가기 전에 해당 이벤트에 신호를 표시할 때까지 기다립니다. 각 스레드가 중요한 섹션을 떠난 후 다른 스레드를 해제하도록 이벤트를 신호로 보냅니다.

Windows Server 2003 및 Windows XP: 중요한 섹션에서 대기 중인 스레드는 대기 큐에 추가됩니다. 깨우고 일반적으로 큐에 추가된 순서대로 중요한 섹션을 획득합니다. 그러나 스레드가 충분히 빠른 속도로 이 큐에 추가되면 대기 중인 각 스레드를 깨우는 데 걸리는 시간으로 인해 성능이 저하될 수 있습니다.

프로세스는 중요한 섹션에서 사용하는 메모리를 할당해야 합니다. 일반적으로 이 작업은 단순히 CRITICAL_SECTION 형식의 변수를 선언하여 수행됩니다. 프로세스의 스레드가 이를 사용하기 전에 InitializeCriticalSection 또는 InitializeCriticalSectionAndSpinCount 함수를 사용하여 중요한 섹션을 초기 합니다.

스레드는 EnterCriticalSection 또는 TryEnterCriticalSection 함수를 사용하여 중요한 섹션의 소유권을 요청합니다. LeaveCriticalSection 함수를 사용하여 중요한 섹션의 소유권을 해제합니다. 중요한 섹션 개체가 현재 다른 스레드에서 소유하는 경우 EnterCriticalSection 은 소유권을 무기한 대기합니다. 반면, 상호 제외에 뮤텍스 개체를 사용하는 경우 대기 함수는 지정된 시간 제한 간격을 허용합니다. TryEnterCriticalSection 함수는 호출 스레드를 차단하지 않고 중요한 섹션을 입력하려고 시도합니다.

스레드가 중요한 섹션을 소유하는 경우 실행을 차단하지 않고 EnterCriticalSection 또는 TryEnterCriticalSection을 추가로 호출할 수 있습니다. 이렇게 하면 스레드가 이미 소유하고 있는 중요한 섹션을 기다리는 동안 스레드가 교착 상태가 발생하지 않습니다. 소유권을 해제하려면 스레드가 중요 섹션에 들어갈 때마다 LeaveCriticalSection 을 한 번 호출해야 합니다. 대기 중인 스레드가 중요한 섹션의 소유권을 획득하는 순서에 대한 보장은 없습니다.

스레드는 InitializeCriticalSectionAndSpinCount 또는 SetCriticalSectionSpinCount 함수를 사용하여 중요한 섹션 개체에 대한 스핀 수를 지정합니다. 회전은 스레드가 잠긴 중요한 섹션을 획득하려고 하면 스레드가 루프에 들어가 잠금이 해제되었는지 확인하고 잠금이 해제되지 않으면 스레드가 절전 모드로 이동한다는 것을 의미합니다. 단일 프로세서 시스템에서는 스핀 수가 무시되고 중요한 섹션 스핀 수가 0으로 설정됩니다. 다중 프로세서 시스템에서 중요한 섹션을 사용할 수 없는 경우 호출 스레드는 중요 섹션과 연결된 세마포에서 대기 작업을 수행하기 전에 dwSpinCount 시간을 회전합니다. 스핀 작업 중에 임계 영역이 해제되면 호출 스레드는 대기 작업을 방지합니다.

프로세스의 모든 스레드는 DeleteCriticalSection 함수를 사용하여 중요한 섹션 개체가 초기화될 때 할당되는 시스템 리소스를 해제할 수 있습니다. 이 함수를 호출한 후에는 중요한 섹션 개체를 동기화에 사용할 수 없습니다.

중요한 섹션 개체가 소유되는 경우 영향을 받는 다른 스레드는 EnterCriticalSection 호출에서 소유권을 기다리는 스레드뿐입니다. 대기하지 않는 스레드는 계속 실행할 수 있습니다.

뮤텍스 개체

중요 섹션 개체 사용