EnterCriticalSection 함수(synchapi.h)

지정된 임계 영역 개체의 소유권을 기다립니다. 함수가 호출 스레드가 소유권을 부여받는 시기를 반환합니다.

구문

void EnterCriticalSection(
  [in, out] LPCRITICAL_SECTION lpCriticalSection
);

매개 변수

[in, out] lpCriticalSection

중요한 섹션 개체에 대한 포인터입니다.

반환 값

이 함수는 값을 반환하지 않습니다.

이 함수는 중요한 섹션에 대한 대기 작업이 시간 초과되는 경우 STATUS_POSSIBLE_DEADLOCK라고도 하는 EXCEPTION_POSSIBLE_DEADLOCK발생합니다. 시간 제한 간격은HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session ManagerCriticalSectionTimeout 레지스트리 값 \ 으로 지정됩니다. 가능한 교착 상태 예외를 처리하지 마세요. 대신 애플리케이션을 디버그합니다.

설명

단일 프로세스의 스레드는 상호 배제 동기화에 중요한 섹션 개체를 사용할 수 있습니다. 프로세스는 CRITICAL_SECTION 형식의 변수를 선언하여 수행할 수 있는 중요한 섹션 개체에 사용되는 메모리를 할당합니다. 중요한 섹션을 사용하기 전에 프로세스의 일부 스레드는 InitializeCriticalSection 또는 InitializeCriticalSectionAndSpinCount 를 호출하여 개체를 초기화해야 합니다.

공유 리소스에 대한 상호 배타적 액세스를 사용하도록 설정하기 위해 각 스레드는 EnterCriticalSection 또는 TryEnterCriticalSection 함수를 호출하여 보호된 리소스에 액세스하는 코드 섹션을 실행하기 전에 중요한 섹션의 소유권을 요청합니다. 차이점은 TryEnterCriticalSection 이 중요한 섹션의 소유권을 얻었는지 여부에 관계없이 즉시 반환되는 반면 , EnterCriticalSection 은 스레드가 중요한 섹션의 소유권을 가져올 때까지 차단된다는 것입니다. 보호된 코드 실행이 완료되면 스레드는 LeaveCriticalSection 함수를 사용하여 소유권을 포기하여 다른 스레드가 소유자가 되고 보호된 리소스에 액세스할 수 있도록 합니다. 대기 중인 스레드가 중요한 섹션의 소유권을 획득하는 순서에 대한 보장은 없습니다.

스레드에 중요한 섹션의 소유권이 있으면 실행을 차단하지 않고 EnterCriticalSection 또는 TryEnterCriticalSection을 추가로 호출할 수 있습니다. 이렇게 하면 스레드가 이미 소유하고 있는 중요한 섹션을 기다리는 동안 스레드가 교착 상태가 발생하지 않습니다. 스레드는 EnterCriticalSectionTryEnterCriticalSection 이 성공할 때마다 중요한 섹션에 들어갑니다. 스레드는 중요 섹션에 들어갈 때마다 LeaveCriticalSection 을 한 번 호출해야 합니다.

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

스레드가 중요한 섹션의 소유권을 가지고 있는 동안 종료되는 경우 위험 섹션의 상태는 정의되지 않습니다.

중요한 섹션이 여전히 소유되는 동안 삭제된 경우 삭제된 중요 섹션의 소유권을 기다리는 스레드의 상태는 정의되지 않습니다.

프로세스가 종료되는 동안 EnterCriticalSection 호출이 차단되면 프로세스가 즉시 종료됩니다. 이로 인해 전역 소멸자를 호출하지 않을 수 있습니다.

예제

EnterCriticalSection을 사용하는 예제는 중요 섹션 개체 사용을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 synchapi.h(Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2에 Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

중요 섹션 개체

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

동기화 함수

TryEnterCriticalSection

VBS Enclave에서 사용할 수 있는 Vertdll API