TLS는 각 스레드마다 독립적으로 가지는 저장공간이다.
같은 변수나 메모리 영역이라도 스레드마다 다른 값을 가질 수 있게 해주는 메커니즘

 

📌 기본 개념

  • 전역 변수의 문제점 : 모든 스레드가 공유하므로 동기화 필요.
  • TLS의 해결책 : 각 스레드마다 독립적인 저장공간을 제공
  • 키 - 값 구조 : TLS 인덱스(키)를 통해 각 스레드별 데이터에 접근

 

📌 기본함수들

 

// TLS 인덱스 할당
DWORD TlsAlloc(void);

// TLS에 값 저장 (스레드별로 독립적)
BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue);

// TLS에서 값 가져오기 (스레드별로 독립적)
LPVOID TlsGetValue(DWORD dwTlsIndex);

// TLS 인덱스 해제
BOOL TlsFree(DWORD dwTlsIndex);

 

📌 동작 원리

DWORD g_TlsIndex;

void ThreadFunction()
{
    // 각 스레드마다 다른 값을 저장할 수 있음
    int* myData = new int(GetCurrentThreadId());
    TlsSetValue(g_TlsIndex, myData);
    
    // 나중에 이 스레드에서 다시 호출하면 같은 값이 나옴
    int* retrievedData = (int*)TlsGetValue(g_TlsIndex);    
}

 

📌 TLS( Thread Local Storage ) 메모리 구조

Process Memory Space
├── Global/Static Memory (모든 스레드 공유)
├── Heap Memory (모든 스레드 공유)
└── Thread Specific Areas
    ├── Thread 1
    │   ├── Stack
    │   └── TLS Area (Index 0: ptr1, Index 1: ptr2, ...)
    ├── Thread 2
    │   ├── Stack  
    │   └── TLS Area (Index 0: ptr3, Index 1: ptr4, ...)
    └── Thread 3
        ├── Stack
        └── TLS Area (Index 0: ptr5, Index 1: ptr6, ...)

 

📌 실제 동작 예제

class Example 
{
private:
    DWORD _tlsIndex;          // 모든 스레드가 공유하는 인덱스
    static int s_globalCount; // 모든 스레드가 공유하는 변수
    
public:
    Example() {
        _tlsIndex = TlsAlloc();
    }
    
    void SetThreadData(int value) {
        // 각 스레드마다 다른 메모리 위치에 저장됨
        int* data = new int(value);
        TlsSetValue(_tlsIndex, data);
    }
    
    int GetThreadData() {
        // 현재 스레드의 데이터를 반환
        int* data = (int*)TlsGetValue(_tlsIndex);
        return data ? *data : 0;
    }
};

 

'언어 > C' 카테고리의 다른 글

[C] Lock-free Stack  (0) 2025.06.14
[C] Lock-free 알고리즘  (0) 2025.06.13
[C] HANDLE 닫고 NULL 넣는 이유  (0) 2025.06.02
[C] 미리 컴파일된 헤더  (0) 2025.05.29
[C] 템플릿 함수를 헤더에 정의해야하는 이유  (0) 2025.05.29

+ Recent posts