멀티쓰레드프로그래밍
TLS (ThreadLocalStorage)
kcj3054
2022. 4. 6. 22:21
TLS란?
쓰레드는 각기 스택영역을 자기만의 독자적인 영역을 가진다 TLS도 동일하다 각각의 독자적인 쓰레드의 영역이다.
문제!!! 쓰레드는 스택도 그렇고 TLS도 그렇고 모두 독자적인 공간이 왜 두개나 있나 왜 굳이 TLS가 필요한가?
- 스택영역은 해당범위를 넘어가면 소멸하게된다 그렇지만 TLS는 진짜 자신만의 영역이다. 자신만의 전역 영역이라고 생각하면 좋을 것같다. TLS를 살펴볼 때 좋은 비유를 학습하였다. -> 뷔페에 가서 음식을 떠 오는 과정에서 조금씩 떠 오기보다. 많이 자신이 먹을 만큼 음식을 떠 오면 굳이 다시 음식이 있는 곳으로 여러번 이동하지 않아도된다.
또한 send Buffer도 TLS에 넣어 놓고 사용할 수 있다.
TLS 코드
#include "pch.h"
#include <iostream>
#include <thread>
#include <atomic>
#include <mutex>
#include <Windows.h>
#include <future>
using namespace std;
thread_local int32 _LThreadId = 0;
void ThreadMain(int32 threadId)
{
//각각의 쓰레드마다 고유한 쓰레드 ID를 가질 수 있다
// 다른쓰레드가 다른 쓰레드의 값을 덮어쓰지않는다.
_LThreadId = threadId;
while (true)
{
cout << "I am Thread : " << _LThreadId << endl;
this_thread::sleep_for(1s);
}
}
int main()
{
vector<thread> threads;
for (int i = 0; i < 10; i++)
{
int32 threadId = i + 1;
threads.push_back(thread(ThreadMain, threadId));
}
for (thread& t : threads)
t.join();
}
위의 소스에서 _LThreadId가 thread_local이 아니라면 쓰레드ID가 덮어쓰이게된다...
위에서 1단계 FOR문에서 1번부터10번까지.. 돌면서 각기 쓰레드 고유한 ID를 출력한다 ..
루키스님의 서버강의를 학습 후 작성하였습니다.