Thread Local Storage(TLS)

원래벌레·2022년 7월 3일
1
post-custom-banner

들어가기에 앞서..
TLS의 필요성을 살펴보자, 게임서버 같은 경우에는 락이 여러군데에 존재한다. 그 이유는 쓰레드와 태스크를 일대일로 잘 배분했다. 하더라도 쓰레드가 하나의 태스크에 몰리게 되는 상황이 생겨날 수 있을 것이다. 이러한 경우 충돌이 일어나기 때문에 lock을 걸기 위해 mutex가 존재하게 된다. 이 경우 경합에서 지게되는 쓰레드들은 모두 대기 상태로 들어가기 때문에 쓰레드가 일을 하지 못하게 되는 문제가 발생하게 된다. 이것을 막기 위해 우리는 TLS를 사용한다.

💎 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();
}

  • 쓰레드 각각에 자신의 쓰레드 번호를 TLS에 저장을 했고, TLS의 값을 출력하기 때문에 전역변수 영역에 ThreadId를 선언하여도, 위와 같이 각각 다른 값을 출력하는 것을 볼 수 있다.
profile
학습한 내용을 담은 블로그 입니다.
post-custom-banner

0개의 댓글