반응형

ThreadStatic과 ThreadLocal의 역할은 각 스레드가 고유한 변수를 지니게 만드는 것이다.

 

다만 약간의 차이가 있으며 그 사항은 아래와 같다.

1. ThreadStatic의 경우 전역  변수에 한해서 사용 가능하다.

2. ThreadStatic에 초기값을 설정할 시 모든 스레드가 기본 초기값으로만 초기화가 된다.

 

[ThreadStatic]
public static int staticVal = 10;


public void int Main()
{
	staticVal = 25;
    
    Thread t1 = new Thread(()=>{
    	Console.WriteLine(staticVal);
    });
    staticVal = 50;
    Thread t2 = new Thread(()=>{
    	Console.WriteLine(staticVal);
    });
    staticVal = 100;
    Thread t3 = new Thread(()=>{
    	Console.WriteLine(staticVal);
    });
}

대충 위와 같은 코드가 존재할 시 각 출력함수들은 모두 10을 출력하게 된다.

이유는 Main함수가 속한 Thread에서의 staticValue값과 t1, t2, t3에서의 staticValue 값은 별개이기 때문이다.

 

ThreadLocal의 경우 ThreadStatic과 같이 각 스레드에 속한 고유 변수를 만들 때 사용한다.

다만 차이점으로는 ThreadStatic과 달리 초기값지정이 가능하다는 것과 전역변수일 필요가 없다는 점이다.

 

public void Main()
{
	ThreadLocal<int> tId = new ThreadLocal<int>(()=>{
    	return Thread.CurrentThread.ManagedThreadId;
    });
    
    Thread t1 = new Thread(()=>{
    	Console.WriteLine("tid : "+tId);
    });
    Thread t2 = new Thread(()=>{
    	Console.WriteLine("tid : "+tId);
    });
    Thread t3 = new Thread(()=>{
    	Console.WriteLine("tid : "+tId);
    });
}

대충 위와 같은 코드의 경우 t1~t3은 각각 생성된 Thread의 id 값으로 초기화가 된다.

 

간단하게 게임등에서 사용하는 경우로는 random과 관련된 로직이 있다.

단순 random의 경우 단순 시간정보로 시드를 대입하면 모든 스레드에서 동일한 값이 추출되지만

이 시드값에 위의 코드처럼 각 스레드의 고유한 값을 조합한다면 모두 다른 랜덤값이 추출될 것이다.

 

다만 ThreadLocal의 경우 .Net 4.0 부터 추가됐기 때문에 버전을 고려해서 사용해야 한다.

ThreadLocal<Random> tRand = new ThreadLocal(()=>{
	return new Random();
});

ThreadLocal<Random> tRand2 = new ThreadLocal(()=>{
	return new Random(Thread.CurrentThreadId + something);
});

위 코드 둘다 각 스레드 고유의 랜덤을 생성해서 반환하지만 

tRand의 경우 만약 다른 두 스레드의 초기화 시간이 미미한 차이라면 같은 Random분포를 지니게 된다.

tRand2의 경우처럼 스레드 개별 정보를 추가해서 구분해준다면 모든 스레드의 Random객체는 다른 분포를 지니게 될 것이다.

 

반응형

'개발언어 > C#' 카테고리의 다른 글

Thread와 Task  (0) 2021.06.20
CancellationTokenSource 과 CancellationToken  (0) 2019.11.29
알아두면 어쩌다 쓸것같은 Attribute들-1  (0) 2019.09.05
async, await란  (0) 2019.08.11
Posted by Sweetmeats_boy

블로그 이미지
Sweetmeats_boy

태그목록

Yesterday
Today
Total

달력

 « |  » 2024.9
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함