Thread Local Storage

Eunho Bae·2022년 5월 3일
0

설명

쓰레드마다 고유하게 접근 가능한 전역변수.
서로 의존성이 묶여있는(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);
        }
    }
profile
개인 공부 정리

0개의 댓글

관련 채용 정보