• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

ThreadLocal<SendBuffer> 질문

22.07.07 19:11 작성 조회수 245

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) 충돌하는 상황이라면 문제가 되는지 궁금합니다.

항상 감사합니다.

답변 1

답변을 작성해보세요.

2

1) 음~ 몇 번 읽어봤는데 질문이 이해가 안 갑니다 OTL
2)  TLS 영역은 각기 따로 관리하기 때문에 Open/Close를 여러 쓰레드에서 동시에 하더라도
서로 영향을 주지 않습니다. 버퍼를 열어서 패킷 정보를 기록하고 다시 닫는 부분까지는
개별적으로 하기 때문에 서로 충돌할 수가 없습니다.