InitializeCriticalSectionAndSpinCount 함수(synchapi.h)

중요한 섹션 개체를 초기화하고 중요 섹션의 스핀 수를 설정합니다. 스레드가 잠긴 중요한 섹션을 획득하려고 하면 스레드가 회전합니다. 스핀 횟수를 반복하는 루프에 들어가 잠금이 해제되었는지 확인합니다. 루프가 완료되기 전에 잠금이 해제되지 않으면 스레드가 절전 모드로 전환되어 잠금이 해제될 때까지 기다립니다.

구문

BOOL InitializeCriticalSectionAndSpinCount(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount
);

매개 변수

[out] lpCriticalSection

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

[in] dwSpinCount

임계 영역 개체의 스핀 수입니다. 단일 프로세서 시스템에서는 스핀 수가 무시되고 중요한 섹션 스핀 수가 0으로 설정됩니다. 다중 프로세서 시스템에서 중요한 섹션을 사용할 수 없는 경우 호출 스레드는 중요 섹션과 연결된 세마포에서 대기 작업을 수행하기 전에 dwSpinCount 시간을 회전합니다. 스핀 작업 중에 임계 영역이 해제되면 호출 스레드는 대기 작업을 방지합니다.

반환 값

이 함수는 항상 성공하고 0이 아닌 값을 반환합니다.

Windows Server 2003 및 Windows XP: 함수가 성공하면 반환 값은 0이 아닌 값입니다. 함수가 실패하면 반환 값은 0 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다. Windows Vista부터 InitializeCriticalSectionAndSpinCount 함수는 메모리 부족 상황에서도 항상 성공합니다.

설명

단일 프로세스의 스레드는 상호 제외 동기화에 중요한 섹션 개체를 사용할 수 있습니다. 스레드가 중요한 섹션의 소유권을 얻는 순서는 보장되지 않습니다. 그러나 시스템은 모든 스레드에 공평합니다.

프로세스는 CRITICAL_SECTION 형식의 변수를 선언하여 수행할 수 있는 중요한 섹션 개체에서 사용하는 메모리를 할당합니다. 중요한 섹션을 사용하기 전에 프로세스의 일부 스레드가 개체를 초기화해야 합니다. 이후에 SetCriticalSectionSpinCount 함수를 호출하여 스핀 수를 수정할 수 있습니다.

중요 섹션 개체를 초기화한 후 프로세스의 스레드는 EnterCriticalSection, TryEnterCriticalSection 또는 LeaveCriticalSection 함수에서 개체를 지정하여 공유 리소스에 대한 상호 배타적 액세스를 제공할 수 있습니다. 서로 다른 프로세스의 스레드 간에 유사한 동기화를 수행하려면 뮤텍스 개체를 사용합니다.

중요한 섹션 개체를 이동하거나 복사할 수 없습니다. 또한 프로세스는 개체를 수정하지 않아야 하지만 논리적으로 불투명한 것으로 처리해야 합니다. 중요한 섹션 함수만 사용하여 중요한 섹션 개체를 관리합니다. 중요 섹션 사용을 마쳤으면 DeleteCriticalSection 함수를 호출합니다.

중요한 섹션 개체를 삭제해야 다시 초기화할 수 있습니다. 이미 초기화된 중요한 섹션을 초기화하면 정의되지 않은 동작이 발생합니다.

스핀 수는 높은 수준의 경합을 경험할 수 있는 짧은 기간의 중요한 섹션에 유용합니다. SMP 시스템의 애플리케이션에 힙에서 메모리를 지속적으로 할당하고 해제하는 2~3개의 스레드가 있는 최악의 시나리오를 고려합니다. 애플리케이션은 중요한 섹션을 사용하여 힙을 직렬화합니다. 최악의 경우 중요한 섹션에 대한 경합은 일정하며 각 스레드는 WaitForSingleObject 함수를 처리 집약적으로 호출합니다. 그러나 스핀 수가 제대로 설정된 경우 호출 스레드는 경합이 발생할 때 WaitForSingleObject를 즉시 호출하지 않습니다. 대신 호출 스레드는 스핀 작업 중에 해제된 경우 중요한 섹션의 소유권을 획득할 수 있습니다.

짧은 기간의 중요한 섹션에 대해 작은 스핀 수를 선택하여 성능을 크게 향상시킬 수 있습니다. 예를 들어 힙 관리자는 힙별 중요 섹션에 대해 약 4,000의 스핀 수를 사용합니다.

이 함수를 사용하는 애플리케이션을 컴파일하려면 _WIN32_WINNT0x0403 이상을 정의합니다. 자세한 내용은 Windows 헤더 사용을 참조하세요.

예제

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

요구 사항

   
지원되는 최소 클라이언트 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

InitializeCriticalSectionEx

SetCriticalSectionSpinCount

동기화 함수

WaitForSingleObject

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