스레드 로컬 저장소Thread Local Storage

Microsoft 전용Microsoft Specific

TLS(스레드 로컬 저장소)는 지정된 다중 스레드 프로세스의 각 스레드에서 스레드별 데이터의 저장소를 할당하는 메커니즘입니다.Thread Local Storage (TLS) is the mechanism by which each thread in a given multithreaded process allocates storage for thread-specific data. 표준 다중 스레드 프로그램에서 데이터는 지정된 프로세스의 모든 스레드에서 공유되지만 스레드 로컬 저장소는 스레드별 데이터를 할당하기 위한 메커니즘입니다.In standard multithreaded programs, data is shared among all threads of a given process, whereas thread local storage is the mechanism for allocating per-thread data. 스레드에 대한 자세한 내용은 Windows SDKWindows SDK에 있는 프로세스 및 스레드를 참조하세요.For a complete discussion of threads, see Processes and Threads in the Windows SDKWindows SDK.

Microsoft C 언어에는 스레드 로컬 변수를 선언하기 위해 __declspec 키워드와 함께 사용되는 확장 저장소 클래스 특성, 스레드가 포함되어 있습니다.The Microsoft C language includes the extended storage-class attribute, thread, which is used with the __declspec keyword to declare a thread local variable. 예를 들어, 다음 코드는 정수 스레드 로컬 변수를 선언한 다음 값으로 초기화합니다.For example, the following code declares an integer thread local variable and initializes it with a value:

__declspec( thread ) int tls_i = 1;  

정적으로 바인딩된 스레드 로컬 변수를 선언하는 경우 이러한 지침을 준수해야 합니다.These guidelines must be observed when you are declaring statically bound thread local variables:

  • 동적 초기화가 있는 스레드 로컬 변수는 DLL이 로드되게 하는 스레드와 프로세스에서 이미 실행 중인 스레드에서만 초기화됩니다.Thread-local variables that have dynamic initialization are only initialized on the thread that causes the DLL to load, and threads that are already running in the process. 자세한 내용은 스레드를 참조하세요.For more information, see thread.

  • 데이터 선언 및 정의에만 thread 특성을 적용할 수 있습니다.You can apply the thread attribute only to data declarations and definitions. 함수 선언 또는 정의에는 사용할 수 없습니다.It cannot be used on function declarations or definitions. 예를 들어, 다음 코드는 컴파일러 오류를 생성합니다.For example, the following code generates a compiler error:

    #define Thread   __declspec( thread )  
    Thread void func();      /* Error */  
    
  • 정적 저장 기간이 있는 데이터 항목에만 thread 특성을 지정할 수 있습니다.You can specify the thread attribute only on data items with static storage duration. 여기에는 전역 데이터(정적 및 외부 모두)와 지역 정적 데이터가 포함됩니다.This includes global data (both static and extern) and local static data. 자동 데이터는 thread 특성을 사용하여 선언할 수 없습니다.You cannot declare automatic data with the thread attribute. 예를 들어, 다음 코드는 컴파일러 오류를 생성합니다.For example, the following code generates compiler errors:

    #define Thread   __declspec( thread )  
    void func1()  
    {  
        Thread int tls_i;            /* Error */  
    }  
    
    int func2( Thread int tls_i )    /* Error */  
    {  
       return tls_i;  
    }  
    
  • 스레드 로컬 데이터의 선언과 정의가 같은 파일에서 발생하는지 다른 파일에서 발생하는지에 관계없이 해당 선언과 정의에 대해 thread 특성을 사용해야 합니다.You must use the thread attribute for the declaration and the definition of thread local data, regardless of whether the declaration and definition occur in the same file or separate files. 예를 들어, 다음 코드는 오류를 생성합니다.For example, the following code generates an error:

    #define Thread   __declspec( thread )  
    extern int tls_i;     /* This generates an error, because the   */  
    int Thread tls_i;     /* declaration and the definition differ. */  
    
  • thread 특성은 형식 한정자로 사용할 수 없습니다.You cannot use the thread attribute as a type modifier. 예를 들어, 다음 코드는 컴파일러 오류를 생성합니다.For example, the following code generates a compiler error:

    char *ch __declspec( thread );      /* Error */  
    
  • 스레드 지역 변수의 주소는 상수로 간주되지 않으므로 이 주소를 포함하는 모든 식은 상수 식으로 간주되지 않습니다.The address of a thread local variable is not considered constant, and any expression involving such an address is not considered a constant expression. 이는 스레드 지역 변수의 주소를 포인터에 대한 이니셜라이저로 사용할 수 없음을 의미합니다.This means that you cannot use the address of a thread local variable as an initializer for a pointer. 예를 들어, 컴파일러는 다음 코드를 오류로 플래그를 지정합니다.For example, the compiler flags the following code as an error:

    #define Thread   __declspec( thread )  
    Thread int tls_i;  
    int *p = &tls_i;      /* Error */  
    
  • C에서는 비정적 범위의 개체에 한해 자신에 대한 참조를 포함하는 식으로 변수를 초기화할 수 있습니다.C permits initialization of a variable with an expression involving a reference to itself, but only for objects of nonstatic extent. 예:For example:

    #define Thread   __declspec( thread )  
    Thread int tls_i = tls_i;             /* Error */  
    int j = j;                            /* Error */  
    Thread int tls_i = sizeof( tls_i )    /* Okay  */  
    

    초기화되는 변수를 포함하는 sizeof 식은 자신에 대한 참조를 구성하지 않으며 허용됩니다.Note that a sizeof expression that includes the variable being initialized does not constitute a reference to itself and is allowed.

  • __declspec(thread)의 사용은 DLL 가져오기의 지연 로드를 방해할 수 있습니다.The use of __declspec(thread) may interfere with delay loading of DLL imports.

    thread 특성 사용에 대한 자세한 내용은 다중 스레딩 항목을 참조하세요.For more information about using the thread attribute, see Multithreading Topics.

    Microsoft 전용 종료END Microsoft Specific

참고 항목See Also

C 확장 저장소 클래스 특성C Extended Storage-Class Attributes