스레드

Microsoft 전용

thread 확장 스토리지 클래스 한정자는 스레드 로컬 변수를 선언하는 데 사용됩니다. C++11 이상에서 이식 가능한 해당 항목의 경우 이식 가능한 코드에 thread_local 스토리지 클래스 지정자를 사용합니다. Windows thread_local 에서 .을 사용하여 __declspec(thread)구현됩니다.

구문

__declspec(thread)declarator

설명

TLS(스레드 로컬 스토리지)는 다중 스레드 프로세스의 각 스레드가 스레드 데이터를 위한 스토리지를 할당하는 메커니즘입니다. 표준 다중 스레드 프로그램에서 데이터는 지정된 프로세스의 모든 스레드에서 공유되지만 스레드 로컬 스토리지는 스레드별 데이터를 할당하기 위한 메커니즘입니다. 스레드에 대한 자세한 내용은 다중 스레딩을 참조 하세요.

스레드 지역 변수의 선언은 확장 특성 구문__declspec 키워드(keyword) 키워드(keyword) thread 사용해야 합니다. 예를 들어, 다음 코드는 정수 스레드 로컬 변수를 선언한 다음 값으로 초기화합니다.

__declspec( thread ) int tls_i = 1;

동적으로 로드된 라이브러리에서 스레드 로컬 변수를 사용하는 경우 스레드-로컬 변수가 올바르게 초기화되지 않을 수 있는 요인을 알고 있어야 합니다.

  1. 함수 호출(생성자 포함)을 사용하여 변수를 초기화하는 경우 이 함수는 이진/DLL을 프로세스로 로드한 스레드와 이진/DLL이 로드된 후에 시작된 스레드에 대해서만 호출됩니다. 초기화 함수는 DLL이 로드될 때 이미 실행 중인 다른 스레드에 대해 호출되지 않습니다. 동적 초기화는 DLL_THREAD_ATTACH 대한 DllMain 호출에서 발생하지만 스레드가 시작될 때 DLL이 프로세스에 없는 경우 DLL은 해당 메시지를 가져오지 않습니다.

  2. 상수 값을 사용하여 정적으로 초기화되는 스레드 지역 변수는 일반적으로 모든 스레드에서 제대로 초기화됩니다. 그러나 2017년 12월 현재 Microsoft C++ 컴파일러에서 변수가 정적 초기화 대신 동적으로 수신하는 constexpr 알려진 규칙 문제가 있습니다.

    참고: 이러한 두 문제는 컴파일러의 향후 업데이트에서 해결될 것으로 예상됩니다.

또한 스레드 로컬 개체 및 변수를 선언할 때 다음 지침을 준수해야 합니다.

  • 클래스 및 데이터 선언 및 정의에만 특성을 적용 thread 할 수 있습니다. thread 함수 선언이나 정의에는 사용할 수 없습니다.

  • 정적 스토리지 기간이 있는 thread 데이터 항목에서만 특성을 지정할 수 있습니다. 여기에는 전역 데이터 개체(및 staticextern), 로컬 정적 개체 및 클래스의 정적 데이터 멤버가 포함됩니다. 특성을 사용하여 자동 데이터 개체를 선언할 thread 수 없습니다.

  • 선언 및 정의가 thread 동일한 파일에서 발생하든 별도의 파일에서 발생하는지 여부에 관계없이 스레드 로컬 개체의 선언 및 정의에 특성을 사용해야 합니다.

  • 특성을 형식 한정자로 사용할 thread 수 없습니다.

  • 특성을 사용하는 thread 개체의 선언이 허용되므로 다음 두 예제는 의미상 동일합니다.

    // declspec_thread_2.cpp
    // compile with: /LD
    __declspec( thread ) class B {
    public:
       int data;
    } BObject;   // BObject declared thread local.
    
    class B2 {
    public:
       int data;
    };
    __declspec( thread ) B2 BObject2;   // BObject2 declared thread local.
    
  • 표준 C는 비정적 개체에 대해서만 자체에 대한 참조를 포함하는 식을 사용하여 개체 또는 변수의 초기화를 허용합니다. C++는 일반적으로 자체에 대한 참조와 관련된 식을 사용하여 개체의 동적 초기화를 허용하지만 스레드 로컬 개체에서는 이러한 유형의 초기화가 허용되지 않습니다. 예시:

    // declspec_thread_3.cpp
    // compile with: /LD
    #define Thread __declspec( thread )
    int j = j;   // Okay in C++; C error
    Thread int tls_i = sizeof( tls_i );   // Okay in C and C++
    

    sizeof 초기화되는 개체를 포함하는 식은 자체에 대한 참조를 구성하지 않으며 C 및 C++에서 허용됩니다.

Microsoft 전용 종료

참고 항목

__declspec
키워드
TLS(스레드 로컬 스토리지)