멀티쓰레드 프로그래밍

Thread Local Storage

우대비 2024. 2. 27. 12:04
반응형

Thread Local Storage (TLS) 설명

Thread Local Storage (TLS)는 각 스레드가 자신만의 데이터 복사본을 가질 수 있게 하는 메커니즘입니다.

TLS를 사용하면, 각 스레드는 다른 스레드와 데이터를 공유하지 않고,

각 스레드에 대해 고유한 데이터 인스턴스를 유지할 수 있습니다.

이 방식은 멀티스레딩 환경에서 데이터 경쟁 조건을 방지하고 스레드 안전성을 높이는 데 유용합니다.

C#에서는 ThreadLocal<T> 클래스를 통해 TLS를 구현할 수 있습니다.

ThreadLocal<T>는 제네릭 타입으로, 스레드마다 별도의 값을 가질 수 있는 변수를 생성합니다.

C# 예시 코드

다음은 C#에서 ThreadLocal<T>를 사용하는 간단한 예제입니다

using System;
using System.Threading;

public class Program
{
    // ThreadLocal 변수 선언 및 초기화
    private static ThreadLocal<int> _threadLocalNumber = new ThreadLocal<int>(() =>
    {
        // 초기값 설정. 여기서는 스레드의 ManagedThreadId를 사용합니다.
        return Thread.CurrentThread.ManagedThreadId;
    });

    public static void Main()
    {
        // 스레드를 생성하고 시작합니다.
        Thread thread1 = new Thread(ShowThreadLocalStorage);
        thread1.Start();

        Thread thread2 = new Thread(ShowThreadLocalStorage);
        thread2.Start();

        ShowThreadLocalStorage(); // 메인 스레드에서도 실행

        thread1.Join();
        thread2.Join();
    }

    private static void ShowThreadLocalStorage()
    {
        Console.WriteLine($"Thread ID: {Thread.CurrentThread.ManagedThreadId}, ThreadLocal value: {_threadLocalNumber.Value}");

        // ThreadLocal 값 변경
        _threadLocalNumber.Value = _threadLocalNumber.Value * 10;

        // 변경된 값을 출력
        Console.WriteLine($"Thread ID: {Thread.CurrentThread.ManagedThreadId}, Updated ThreadLocal value: {_threadLocalNumber.Value}");
    }
}

이 예제에서는 각 스레드가 자신의 ManagedThreadId를 기반으로 초기화된 ThreadLocal<int> 변수를 가지고 있습니다. ShowThreadLocalStorage 메서드는 이 값을 출력하고, 그 다음에 이 값을 10배 증가시킵니다.

주목할 점은 각 스레드가 ThreadLocal<T> 인스턴스의 고유한 복사본을 가지고 있으므로,

한 스레드에서 값을 변경해도 다른 스레드에는 영향을 주지 않는다는 것입니다.

반응형
LIST

'멀티쓰레드 프로그래밍' 카테고리의 다른 글

ReaderWriterLock  (0) 2024.02.27
ManualResetEvent  (0) 2024.02.27
AutoResetEvent  (0) 2024.02.26
Context Switching  (0) 2024.02.26
SpinLock  (0) 2024.02.23