2019. 11. 28. 18:59 개발언어/C#
ThreadStatic 과 ThreadLocal
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 |