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.Value, repeat ? "(repeat)" : ""); }; // Launch eight of them. On 4 cores or less, you should see some repeat ThreadNames // 8개의 액션을 실행 하도록 한다. // 만약 동시 실행되는 Task가 4개라면 나머지 4개는 같은 쓰레드에서 ThreadLocal을 접근 했다는 것을 뜻한다. // 같은 쓰레드 안에서 사용할 값을 컨트롤 할 수 있다. Parallel.Invoke(action, action, action, action, action, action, action, action); // 만약 쓰레드 마다 다른 값을 가져가기 위해서는 ThreadStaticAttribute로 선언해서 사용하면 된다. // [ThreadStatic] ThreadValue 변수 처럼 말이다. // Dispose when you are done ThreadName.Dispose(); } #endregion
[코드1] ThreadLocal<T> 코드 테스트
위 코드를 실행한 결과 화면인 "그림1"을 보면 어떻게 실행되는지 쉽게 알 수 있을 것이다.
[그림1] ThreadLocal 결과 화면
소스 코드 자체에 주석과 직관적인 코딩으로 충분히 파악이 가능할 것으로 예상하므로 별도의 설명을 생략하도록 하겠습니다. 포스트의 내용이 장황한 설명 보다는 주석과 소스코드 자체 만으로도 이해할 수 있도록 하기 위해 노력하였습니다.. 실제 개발에서도 필요한 소스는 단순히 Copy & Paste 만으로도 사용할 수 있습니다. 그리고 주석을 이용해 nDoc이나 별도의 자동 Document 제작 유틸로 API 문서를 만드는 데에도 도움이 되었으면 한다. ing™ |
'.Net Framework' 카테고리의 다른 글
[C# Async] Task의 TaskCreationOptions별 실행 비교와 ThreadPool의 관계 (SetMinThreads SetMaxThreads) #2 (0) | 2013.03.19 |
---|---|
[C# Async] Task의 TaskCreationOptions별 실행 비교와 ThreadPool의 관계 (SetMinThreads SetMaxThreads) #1 (1) | 2013.03.17 |
[C# Thread] 낮은 수준의 동기화 SpinLock (0) | 2013.03.15 |
[C# Thread] TaskFactory and TaskScheduler #2 - TAP (0) | 2013.03.14 |
[C# Thread] TaskFactory and TaskScheduler #1 - TAP (0) | 2013.03.12 |