-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
미해결
ThreadLocal<SendBuffer> 질문
22.07.07 19:11 작성 조회수 263
0
public static class Helper
{
private static readonly ThreadLocal<int> Num = new ThreadLocal<int>(() => 0);
public static int Plus(int n)
{
Num.Value += n;
return Num.Value;
}
}
public class Program
{
public static void Main()
{
var action = () =>
{
Console.WriteLine(Helper.Plus(1));
};
Parallel.Invoke(action, action);
Parallel.Invoke(action, action);
Parallel.Invoke(action, action);
Console.WriteLine(Helper.Plus(100));
/* 결과
* 1
* 1
* 2
* 2
* 3
* 3
* 104
*/
}
}
ThreadLocal<SendBuffer> 타입은 스레드가 해당 값을 참조하려 할 때 스레드의 스택 영역에 할당해주잖아요.
이 것은 마치 냉장고에서 재료를 꺼내러 갔더니 요리사들에게 재료의 사본을 꺼내 주는 것과 같은 거네요?
그렇다는 것은 클라이언트 A와 B는 { 1, 1, 0, 0 }의 ArraySegment 동시에 가져가게 되는 꼴인데,
A와 B가 서로 2 바이트 만큼 SendBuffer에 덧붙인다고 했을 때
A가 Open & Close해서 작성한 SendBuffer {1, 1, 1, 1}과 B가 Open & Close해서 작성한 SendBuffer {1, 1, 1, 0}이 서로 충돌하는 상황이 될 것 같은데요.
1) 제가 이해한 것이 맞는지 궁금하구
2) 충돌하는 상황이라면 문제가 되는지 궁금합니다.
항상 감사합니다.
답변을 작성해보세요.
2
Rookiss
지식공유자2022.07.09
1) 음~ 몇 번 읽어봤는데 질문이 이해가 안 갑니다 OTL
2) TLS 영역은 각기 따로 관리하기 때문에 Open/Close를 여러 쓰레드에서 동시에 하더라도
서로 영향을 주지 않습니다. 버퍼를 열어서 패킷 정보를 기록하고 다시 닫는 부분까지는
개별적으로 하기 때문에 서로 충돌할 수가 없습니다.
답변 1