C# 쓰레드의 지역 저장소 - ThreadLocal

http://msdn.microsoft.com/ko-kr/library/dd642243.aspx



 간혹 쓰레드마다 가지고 있어야 하는 별도의 공간이 필요할 때가 있을 것이다. 이때 사용할 수 있는 객체가 ThreadLocal 클래스다. .Net Framework 4에서 처음 등작 하였다. 이전에는 ThreadStaticAttribute이용해서 이와 같은 유사한 기능을 사용할 수 있었으나 이제는 ThreadLocal을 선언해 사용하기만 하면 된다. 아래 코드를 살펴 보자

#region ThreadLocal 테스트
[ThreadStatic]  // 쓰레드마다 다른 값을 가지도록 한다.
private static string ThreadValue = string.Empty;
 
/// <summary>
/// 데이터의 스레드 로컬 저장소를 제공하는 ThreadLocal를 테스트 한다.
/// </summary>
public void ThreadLocal_TestMethod()
{
    // 데이터의 스레드 로컬 저장소를 제공합니다.
    ThreadLocal<string> ThreadName = new ThreadLocal<string>(() =>
    {
        return "Thread" + Thread.CurrentThread.ManagedThreadId;
    });
 
    Action action = () =>
    {
        // 값이 true면 같은 쓰레드에서 이미 한번 실행되었다는 것이다.
        bool repeat = ThreadName.IsValueCreated;
 
        Console.WriteLine("ThreadName = {0} {1}"ThreadName.Valuerepeat ? "(repeat)" : "");
    };
 
    // Launch eight of them.  On 4 cores or less, you should see some repeat ThreadNames
    // 8개의 액션을 실행 하도록 한다.
    // 만약 동시 실행되는 Task가 4개라면 나머지 4개는 같은 쓰레드에서 ThreadLocal을 접근 했다는 것을 뜻한다.
    // 같은 쓰레드 안에서 사용할 값을 컨트롤 할 수 있다.
    Parallel.Invoke(actionactionactionactionactionactionactionaction);
 
    // 만약 쓰레드 마다 다른 값을 가져가기 위해서는 ThreadStaticAttribute로 선언해서 사용하면 된다.
    // [ThreadStatic] ThreadValue 변수 처럼 말이다.
 
    // Dispose when you are done
    ThreadName.Dispose();
}
#endregion

[코드1] ThreadLocal<T> 코드 테스트


 위 코드를 실행한 결과 화면인 "그림1"을 보면 어떻게 실행되는지 쉽게 알 수 있을 것이다.


[그림1] ThreadLocal 결과 화면


 

소스 코드 자체에 주석과 직관적인 코딩으로 충분히 파악이 가능할 것으로 예상하므로 별도의 설명을 생략하도록 하겠습니다. 포스트의 내용이 장황한 설명 보다는 주석과 소스코드 자체 만으로도 이해할 수 있도록 하기 위해 노력하였습니다.. 실제 개발에서도 필요한 소스는 단순히 Copy & Paste 만으로도 사용할 수 있습니다. 그리고 주석을 이용해 nDoc이나 별도의 자동 Document 제작 유틸로 API 문서를 만드는 데에도 도움이 되었으면 한다. 
※ DOC에 대한 프로그램 정보 Util link

ing™       


+ Recent posts