기록은 기억을 이기고 시간보다 오래 남는다.

게임 서버

TLS(Thread Local Storage) with c++

준_준 2024. 5. 29. 14:47

 


Tread Local Storage

한 줄 요약

- TLS는 스레드 내부에 스레드 본인만 접근할 수 있는 별도의 저장 공간


안녕하세요 준준입니다.

 

오늘은 TLS에 대해 알아보도록 합시다.

TLS(Tread Local Storage)

 

우선 TLS란 Tread Local Storage의 약자로

각 쓰레드가 가지고 있는 자신만의 고유한 공간입니다.

 

  • 왜 TLS가 만들어지고 필요할까요?

Data 영역의 전역 변수, Heap 영역의 객체는 모든 스레드가 공유합니다.

그리고,

Stack 영역의 지역 변수는 해당 블록 내에서만 사용되기 때문에 

기본적으로 각각의 스레드마다 고유하게 가지는 메모리 영역이 없습니다. 

 

또한,

스택에 잡히는 지역 변수는 스레드마다 별도의 스택을 사용하므로 당연히 다른 값을 가지지만

전역 변수의 경우에는 모든 스레드가 공유하므로  접근 시 경합이 발생 할 수 있습니다.

 

이를 해결해 줄 수 있는 게 바로 TLS입니다.

이 공간은 쓰레드 안에 각각 다른 값을 가지는 전역 변수를 말합니다.

따라서 다른 쓰레드는 접근할 수 없고 스레드 자신만 접근할 수 있습니다.

 

TLS의 기능

 

이를 활용하면, 공유 변수로 인해 빈번한 스레드 동기화가 일어나는 문제가 있는 경우

임시로 TLS에 저장하고 나중에 공유 변수에 동기화하는 방식으로 스레드 동기화에 의한 성능 저하를 줄여줄수 있 수 있습니다.

 

각각의 스레드는 고유한 스택을 갖기 때문에 스택 변수는 스레드 별로 고유합니다.

예를 들어 각각의 스레드가 같은 함수를 실행한다고 해도 그 함수에서 정의된 지역 변수는 실제로 서로 다른 메모리 공간에 위치한다는 의미입니다.

그러나 정적 변수와 전역 변수의 경우에는 프로세스 내의 모든 스레드에 의해서 공유된다.

 

위의 특성에 따라, TLS는 정적 전역 변수를 각각의 스레드에게 독립적으로 만들어 주고 싶을 때 사용하는 것입니다.

 

예제 코드

#include <iostream>
#include <thread>
#include <atomic>
#include <future>
#include <Windows.h>

thread_local int32 LThreadid = 0;

void ThreadMain(int32 threadid) {
	LThreadid = threadid;
	while (true)
	{
		cout << "Hi! I am Thread" << 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는 스레드 내부에 본인만 접근할 수 있는 별도의 저장 공간이다.

반응형

'게임 서버' 카테고리의 다른 글

Reader-Writer Lock  (2) 2024.05.29
게임 회사 채용 준비과정  (0) 2023.02.22
게임 서버 개발자 채용 프로세스  (0) 2023.02.14
게임 서버 공부 할 것  (0) 2023.02.05