C++

TLS(Thread Local Storage)

춤추는수달 2022. 2. 1. 19:43

TLS란

쓰레드마다 가지고 있는 로컬 저장소 이다. 이러한 저장소가 필요한 이유를 알아보자. 

여러 쓰레드가 힙에 저장된 특정 변수를 참조하는 상황을 생각해보자. 이러면 하나의 공유 변수를 참조하기 위해 여러 쓰레드가 경합을 벌이게 된다. 즉 하나의 쓰레드가 참조하고 있으면 다른 쓰레드는 기다려야 한다는 뜻이다. 하지만 이때 만약 쓰레드마다 자신의 저장공간이 있고 그 공간에 공유 변수를 가져다 놓고 연산을 한다면 경합으로 인한 성능 저하를 피할 수 있을 것이다.

 

스택과 다른 점 : 스택은 함수를 위한 저장소이다. 계속 할당됐다 해제됐다를 반복한다. TLS는 쓰레드마다 영구적으로 데이터를 보관하는 용도로 사용한다. 스택은 영구적으로 뭔가를 저장하기엔 안좋음.

예시

//_declspec(thread) int32 value; //윈도우 환경용(비권장)
thread_local int32 LThreadId = 0; // 표준.(권장) 쓰레드의 로컬 저장소에 변수를 하나 잡음.

void ThreadMain(int threadId)
{
	LThreadId = threradId; //쓰레드마다 자신의 로컬 저장소에 하나 씩 id 저장
}


vector<thread> threads;
for(int i = 0; i< 10; i++)
{
	int threadId = i;
	thread(ThreadMain, threadId); 
}

구문

_declspec(thread) int32 value; //윈도우 환경용

thread_local int32 LThreadId = 0; // 표준.(권장)

thread(ThreadMain, threadId); 

LThreadId = threadId;

'C++' 카테고리의 다른 글

순환문제  (0) 2022.03.28
STL 컨테이너별 간략 특징 정리  (0) 2022.02.21
메모리 모델  (0) 2022.02.01
Futrue  (0) 2022.01.27
조건 변수(Condition Variable)  (0) 2022.01.27