TLS(Thread Local Storage) 를 사용하는 이유
C++/C++ 2021. 5. 1. 22:17 |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 |