TLS
TLS는 스레드 개인 공간으로
공용 영역(Global, Heap)에서 본인이 작업할 데이터들을
어느 정도 끌고 와서 TLS에 저장하고 그와 관련된 작업을 처리한다
이렇게 하면,
매번 공용 영역을 사용할 때 Lock을 걸고 해제하는 것이 아닌
공용 영역의 적당한 크기의 데이터들을
TLS로 들고오거나 반환할 때만 Lock을 걸고 해제하니 효율적이다
TLS vs. Stack
스택과의 차이점은
스택은 함수에 의한 메모리이기에
함수가 종료되면 스택 프레임이 정리되고 사라지는 불안정한 메모리이다
따라서, 스택에 영구적인 데이터를 저장하는 것은 위험하다
그래서 영구적인 데이터인
데이터 영역(전역, static 변수)과 Heap 영역의 데이터를
저장하는 각 스레드만의 개인적인 공간이 바로 TLS이다
예시 코드
int32 GValue;// 전역변수
thread_local int32 LThreadId = 0;// TLS
void ThreadMain(int32 threadId)
{
LThreadId = threadId;
while (true)
{
cout << "My Thread Id :" << LThreadId << endl;
this_thread::sleep_for(1s);
}
}
int main()
{
vector<thread> threads;
for (int32 i = 0; i < 10; i++)
{
int32 threadid = i + 1;
threads.push_back(thread(ThreadMain, threadid));
}
for (thread& t : threads)
t.join();
}
이처럼 TLS는 다양하게 활용할 수 있으며
스레드 각각의 고유 큐를 생성해 관련 작업을 실행할 수도 있다
thread_local queue<int32> q;
'게임 서버' 카테고리의 다른 글
[게임서버 섹션2 Note] 메모리 모델 (0) | 2024.12.31 |
---|---|
[게임서버 섹션2 Note] CPU 파이프라인 (0) | 2024.12.30 |
[게임서버 섹션2 Note] 캐시 (0) | 2024.12.30 |
[게임서버 섹션2 Note] Future (0) | 2024.12.30 |
[게임서버 섹션2 Note] Condition Variable (0) | 2024.12.30 |