쓰레드마다 고유하게 접근 가능한 전역변수.
서로 의존성이 묶여있는(lock을 걸 필요가 있는) 데이터를 각자의 TLS로 갖고 가는 것이 아닌 buffer와 같이 독립적으로 사용할 수 있는 데이터를 TLS에 넣어두고 처리를 하게 되면 lock을 걸 때마다 부하가 걸리는 것을 최소화할 수 있다.
TLS는 쓰레드끼리 경합없이 특정 쓰레드만 사용할 정보를 저장하는데 유용하다.
TLS는 후반 강의에서 SendBuffer를 다룰때 자세히 다뤄볼 예정.
Heap 영역(new)과 데이터 영역(static)은 모든 쓰레드가 공유해서 사용 가능하고 각 쓰레드는 스택 영역을 가지고 있다. 하지만 데이터를 저장하기에 스택 영역은 불안정하기 때문에, 보다 안정적이고 언제 어디서나 접근 가능한 heap, data 영역을 모든 쓰레드가 공유해서 사용하는 것이 아니라, 각자 따로 사용할 수 있는 전역공간(TLS)을 둬서 사용.
일감이 몰릴 때는 각 쓰레드들이 하나씩 일감을 가져가서 처리하기 보다, 최대한 일감을 많이 TLS에 저장해서 가져간 다음 하나씩 처리하도록 하는게 좋다.
class Program
{
// 쓰레드마다 고유의 TLS 영역이 있기 때문에 ThreadName을 바꾼다고 해도 다른 쓰레드에게 영향을 미치지 않음
// ThreadName이 null이면 람다 함수실행 (현재 쓰레드의 ID return)
static ThreadLocal<string> ThreadName = new ThreadLocal<string>(() => { return $"내 이름은 {Thread.CurrentThread.ManagedThreadId}"; });
static void WhoAmI()
{
bool repeat = ThreadName.IsValueCreated;
if(repeat)
Console.WriteLine(ThreadName.Value + "(repeat)");
else
Console.WriteLine(ThreadName.Value);
}
static void Main(string[] args)
{
Parallel.Invoke(WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI);
}
}