TLS(Thread Local Storage) 란?


스레드별로 전역 변수나 정적 변수 등을 위한 저장 공간이 필요할 때 운영체제가 할당해주는 메모리 영역이다.

 

사용방법

1. 컴파일러의 도움을 받기

장점 :

아래와 같이 간편하게 선언할 수 있다

__declspec(thread) int myTlsInt;

단점 : 

컴파일 시 TLS의 크기가 결정되기 때문에 런타임에 재할당 불가.(더 큰 메모리로 사용 불가)

 

운영체제가 일반적으로 사용하는 메모리와는 다른 별도의 메모리 영역을 사용한다.

때문에 컴파일러의 TLS 변수 참조코드는 번역 단계에서 추가적인 명령들이 필요하게 되고, 속도가 좀 느려진다.

 

2. 윈도우에서 제공하는 API를 사용하는 방법 ( TlsAlloc(), TlsSetValue(), TlsGetValue() 등 )

내부적으로 예약된 TLS 공간을 사용하는 방법이다.

//TLS 공간 요청 & TLS 인덱스 반환
DWORD dwTlsIndex = ::TlsAlloc();

//TLS 인덱스에 데이터 저장
::TlsSetValue(dwTlsIndex, pMyData);

//TLS 인덱스의 데이터 불러오기
BYTE* pData = (BYTE*)::TlsGetValue(dwTlsIndex);

//TLS 공간 해제
::TlsFree(dwTlsIndex);

 

장점 : 

사용할 수 있는 영역의 Index를 받아서 BYTE단위로 원하는 데이터를 save/load 할 수 있다.

 

필요할 때마다 TlsAlloc 명령어를 통해서 원하는 공간을 요청할 수 있다는 점에서 동적이다.

 

그리고 기존 메모리 구조를 그대로 사용(하는 것 같다)해서 별도의 추가 명령어가 필요하지 않다.

 

사용이 다소 복잡해 보이긴 하지만, 효율을 원한다면 API의 TLS를 사용하는 것이 좋아 보인다.

단점 : 코드가 늘어나고, 사용이 다소 복잡하다. 

 

TLS가 반드시 필요한 경우

- Thread 별로 생성되는 Stack 영역을 이용하면 되기 때문에 아직까지는 TLS가 꼭 필요한 경우를 생각해내지 못했다.

만약 꼭 필요한 경우가 생긴다면 그때 추가예정.

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

표준 스트림 입력 오류 처리  (0) 2021.05.21
__declspec(align(#)) 과 alignas  (0) 2021.05.07
GCC로 컴파일하기  (0) 2021.04.14
반복자 다루기  (0) 2021.03.26
override 와 final 키워드  (0) 2021.03.26
Posted by Elan
: