중요 섹션 개체
중요한 섹션 개체 단일 프로세스의 스레드에서만 중요한 섹션을 사용할 수 있다는 점을 제외하고 뮤텍스 개체에서 제공하는 것과 유사한 동기화를 제공합니다. 중요한 섹션 개체는 프로세스 간에 공유할 수 없습니다.
이벤트, 뮤텍스 및 세마포 개체는 단일 프로세스 애플리케이션에서도 사용할 수 있지만 중요한 섹션 개체는 상호 배제 동기화(프로세서별 테스트 및 설정 명령)를 위해 약간 더 빠르고 효율적인 메커니즘을 제공합니다. 뮤텍스 개체와 마찬가지로 중요한 섹션 개체는 한 번에 하나의 스레드에서만 소유할 수 있으므로 공유 리소스를 동시에 액세스하지 못하도록 보호하는 데 유용합니다. 뮤텍스 개체와 달리 중요한 섹션이 중단되었는지 여부를 알 수 있는 방법은 없습니다.
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대한 호출에서 소유권을 기다리는 스레드뿐입니다. 대기하지 않는 스레드는 계속 실행할 수 있습니다.
관련 항목
-
중요 섹션 개체 사용