다음을 통해 공유


/Zc:threadSafeInit(스레드로부터 안전한 로컬 정적 초기화)

/Zc:threadSafeInit 컴파일러 옵션은 스레드로부터 안전한 방식으로 정적 로컬(함수 범위) 변수를 초기화하도록 컴파일러에 지시하여 수동 동기화가 필요하지 않습니다. 초기화만 스레드로부터 안전합니다. 여러 스레드에서 정적 지역 변수의 사용 및 수정은 여전히 수동으로 동기화되어야 합니다. 이 옵션은 Visual Studio 2015부터 사용할 수 있습니다. 기본적으로 Visual Studio는 이 옵션을 사용하도록 설정합니다.

구문

/Zc:threadSafeInit[-]

설명

C++11 표준에서는 다른 초기화가 수행되기 전에 정적 또는 스레드 스토리지 기간이 있는 블록 범위 변수를 0으로 초기화해야 합니다. 초기화는 컨트롤이 변수 선언을 처음 통과할 때 발생합니다. 초기화 중에 예외가 throw되면 변수는 초기화되지 않은 것으로 간주되며, 다음에 컨트롤이 선언을 통과할 때 초기화가 다시 시도됩니다. 컨트롤이 초기화와 함께 선언을 동시에 입력하면 초기화가 완료되는 동안 동시 실행이 차단됩니다. 초기화 중에 컨트롤이 선언을 재귀적으로 다시 입력하는 경우 동작은 정의되지 않습니다. 기본적으로 Visual Studio 2015부터 Visual Studio는 이 표준 동작을 구현합니다. 이 동작은 /Zc:threadSafeInit 컴파일러 옵션을 설정하여 명시적으로 지정할 수 있습니다.

/Zc:threadSafeInit 컴파일러 옵션은 기본적으로 설정됩니다. /permissive- 옵션은 /Zc:threadSafeInit에 영향을 주지 않습니다.

스레드로부터 안전한 정적 지역 변수 초기화는 UCRT(유니버설 C 런타임 라이브러리)에 구현된 코드를 사용합니다. UCRT에 대한 종속성을 사용하지 않거나 Visual Studio 2015 이전 버전의 스레드로부터 안전하지 않은 초기화 동작을 유지하려면 /Zc:threadSafeInit- 옵션을 사용합니다. 스레드 안전이 필요하지 않다는 것을 알고 있는 경우 이 옵션을 사용하여 정적 로컬 선언에 대해 약간 더 작고 빠른 코드를 생성합니다.

스레드로부터 안전한 정적 지역 변수는 TLS(스레드 로컬 스토리지)를 내부적으로 사용하여 정적이 이미 초기화되었을 때 효율적인 실행을 제공합니다. 이 기능의 구현은 Windows Vista 이상 운영 체제의 Windows 운영 체제 지원 기능을 사용합니다. Windows XP, Windows Server 2003 및 이전 운영 체제에는 이러한 지원이 없으므로 효율성 이점을 얻을 수 없습니다. 또한 이러한 운영 체제는 로드할 수 있는 TLS 섹션 수에 대한 제한이 낮습니다. TLS 섹션 제한을 초과하면 충돌이 발생할 수 있습니다. 특히 이전 운영 체제에서 실행해야 하는 코드에서 이 문제가 발생하는 경우 /Zc:threadSafeInit-를 사용하여 스레드로부터 안전한 초기화 코드를 사용하지 않도록 설정합니다.

Visual C++의 규칙과 관련된 문제에 대한 자세한 내용은 Nonstandard Behavior을 참조하세요.

Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 드롭다운 메뉴에서 모든 구성을 선택합니다.

  3. 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  4. /Zc:threadSafeInit 또는 /Zc:threadSafeInit를 포함하도록 추가 옵션 속성을 수정한 다음 확인을 선택합니다.

참고 항목

MSVC 컴파일러 옵션
MSVC 컴파일러 명령줄 구문
/Zc(규칙)