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 |