원래 알고있던 내용으로는 쓰레드는 각자 고유한 영역인 Stack 영억을 가지고 있다. 즉, 쓰레드가 실행하는 함수마다 서로 다른 메모리 영역을 할당 받는다.
쓰레드마다 고유의 정보를 정해주어야 한다면 어떻게 해야할까? 함수 안에 넣는다면 함수 실행 종료 시점에 날아가 버릴것이다. 이런 상황에서 사용할 수 있는 것이 Thread Local Storage이다.
Thread Local Storage를 사용하는 방법은 thread_local 키워드를 사용하는 것이다.
thread_local로 선언된 변수는 전역변수처럼 보여도 각 쓰레드에 별도로 생성되는 변수이기 때문에 쓰레드 독립적인 값을 설정하는데 사용될 수 있다.
수명은 쓰레드의 수명과 동일하다. 쓰레드가 시작될 때 생성되고 종료될때 소멸도니다. thread_local 변수는 해당 쓰레드가 처음 실행될 때 초기화된다.
아래 예제코드는 1초마다 쓰레드의 LThreadId를 출력하는 함수를 10개의 쓰레드를 실행하는 코드이다. 인자로 넘겨받은 변수를 thread_local 변수에 입력해 전역 변수처럼 보이지만 각 쓰레드마다 서로 다른 값을 출력하는 것을 볼 수 있다.
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();
return 0;
}