들어가기에 앞서..
TLS의 필요성을 살펴보자, 게임서버 같은 경우에는 락이 여러군데에 존재한다. 그 이유는 쓰레드와 태스크를 일대일로 잘 배분했다. 하더라도 쓰레드가 하나의 태스크에 몰리게 되는 상황이 생겨날 수 있을 것이다. 이러한 경우 충돌이 일어나기 때문에 lock을 걸기 위해 mutex가 존재하게 된다. 이 경우 경합에서 지게되는 쓰레드들은 모두 대기 상태로 들어가기 때문에 쓰레드가 일을 하지 못하게 되는 문제가 발생하게 된다. 이것을 막기 위해 우리는 TLS를 사용한다.
TLS는 쓰레드가 각각 가지고 있는 저장소이다.
이 곳에 저장되는 값들은 전역변수 이지만, 한 쓰레드 내에서만 유효한 전역 변수이다. 이러한 면에서 Stack과는 차이가 있다.
그래서 이 TLS을 이용해서 쓰레드가 집중된 task를 빠르게 처리하는가? 하면, 공유하는 영역인 Heap, 데이터 영역의 값을 사용 할 만큼 큼직하게 잘라서 TLS로 가져온다. 이 과정만 하기 때문에 부하가 크지는 않을 것이다. 이렇게 공유영역에서 가져온 값을 TLS로 옮기면 그 이후에 mutex를 차지하기 위한 경합이 일어나지 않을 것이다.
thread_local int32 LThreadId = 0 ; // thread_local을 작성 하는 것으로 TLS임을 알려준다.
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();
}