728x90
반응형
thread_local은 thread가 TLS(Thread Local Storage)를 지원하기 위해서 C++11부터 추가되었다. 기존에 TLS변수를 선언하기 위해서는 __declspec(thread)를 사용해야만 했다. 하지만 정식으로 thread_local가 도입됨으로 간편하게 사용할 수 있게 되었다.
TLS(Thread Local Storage) : thread 별로 고유한 저장공간을 가질 수 있는 방법이다.
각각의 thread는 고유한 Stack을 가지기 때문에 Stack 변수(지역 변수)는 thread별로 고유하다. 그래서 각각의 thread가 같은 함수를 실행한다고 해도 그 함수에서 정의된 지역 변수는 실제로 서로 다른 메모리 공간에 위치한다는 의미다. 그러나 정적 변수와 전역 변수의 경우에는 모든 thread에 공유된다.
TLS는 정적, 전역 변수를 각각의 thread에게 독립적으로 만들어 주고 싶을 때 사용한다.
#include <iostream>
#include <mutex>
using namespace std;
thread_local unsigned int i = 0;
std::mutex g_mutex;
void OnThread(int nid)
{
++i;
std::unique_lock<std::mutex> lock(g_mutex);
cout << nid << "-thread" << i << endl;
}
int main()
{
thread th1(OnThread, 0);
thread th2(OnThread, 1);
std::unique_lock<std::mutex> lock(g_mutex);
cout << "main thread : " << i << endl;
lock.unlock();
th1.join();
th2.join();
return 0;
}
전역 변수로 선언된 i는 각각의 thread에서 증가를 시킴에도 같은 값을 가지며, main에서도 변하지 않음 값을 표시한다. thread_local을 사용하였기 때문에 변수는 각각의 thread에서만 동작한 것이다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] std::move (0) | 2021.10.08 |
---|---|
[C++] packaged_task (2) | 2021.10.07 |
[C++] error LNK2001: unresolved external symbol (Static member) (0) | 2021.10.07 |
[C++] recursive_mutex (0) | 2021.10.07 |
[C++] result_of (0) | 2021.10.06 |