작성
·
151
·
수정됨
0
SendBufferHelper를 TLS로 구현을 해서 각 쓰레드가 고유한 SendBuffer인스턴스를 갖게 되는데
ArraySegment<byte> openSegment = SendBufferHelper.Open(4096);
byte[] buffer = BitConverter.GetBytes(knight.hp);
byte[] buffer2 = BitConverter.GetBytes(knight.attack);
Array.Copy(buffer, 0, openSegment.Array, openSegment.Offset, buffer.Length);
Array.Copy(buffer2, 0, openSegment.Array, openSegment.Offset + buffer.Length, buffer2.Length);
ArraySegment<byte> sendBuff = SendBufferHelper.Close(buffer.Length + buffer2.Length);
Send(sendBuff);
그럼 이부분에서 A라는 쓰레드가 Open과 Close를 통해 고유한 SendBuffer의 buffer에 정보(패킷)를 저장을 하게되고 그 정보를 Send하게 되고 그걸 sendQueue에 그냥 저장만 한 상태라고 가정을 해보겠습니다. 또 B라는 쓰레드도 위 과정을 해서 Queue에 저장을 하게된다고 하겠습니다.
여기서 궁금한게 일단 A 와 B가 Send를 한 그 정보는 각 쓰레드가 고유한 _buffer에 저장된 정보이고 만약 다른쓰레드가 큐에저장된 값을 보낸다고 할때 ArraySegment는 원본을 참조하니까 A와 B의 고유한 인스턴스에 접근을 해야하는거 아닌가요..? ArraySegment가 원본을 [참조] 하니까 접근을 하지만 [읽기만] 하기때문에 괜찮다. 이렇게 이해를 하면되는건지 아니면 제가 잘못이해하고있는건지 궁급합니다.
답변 2
0
이것저것 만지다보니 다른쓰레드에서 ArraySegment(A쓰레드에서 만듬) 로 찝어준 부분은 접근 및 수정이 가능했습니다. 하지만 막바로 고유한 멤버 _buffer에는 접근 및 수정이 불가능했습니다. 신기하네요...
0
안녕하세요, 인프런 AI 인턴입니다. pnj991122님, SendBuffer와 관련된 질문을 주셨네요.
쓰레드 로컬 저장소(Thread Local Storage)를 사용하여 각 쓰레드가 독립적인 SendBuffer 인스턴스를 가지게 되면, A와 B 두 쓰레드가 각각의 SendBuffer를 사용하여 데이터를 처리하게 됩니다.
SendBuffer를 사용할 때 Open과 Close를 통해 ArraySegment를 생성하게 되며, 이 부분이 데이터를 보낼 때마다 사용됩니다. 쓰레드 A와 쓰레드 B가 각자 Open과 Close를 통해 데이터를 가져가지만, 그 데이터 자체는 원본 배열(Array)을 참조합니다. 따라서 ArraySegment는 그 구조체가 원본 배열을 가리키고 있어 데이터를 참조할 수 있습니다.
질문 주신 내용에서 “다른 쓰레드가 큐에 저장된 값을 보낸다고 할 때”라는 부분은, 해당 쓰레드의 큐에 있는 데이터는 이미 ArraySegment를 통해 올바르게 분리되어 다른 쓰레드에서는 데이터를 그대로 사용하거나, 읽기 전용으로 사용할 수 있음을 의미합니다. ArraySegment는 참조이기 때문에 직접 데이터를 변형하지는 않고, 다만 ‘어디에 어떤 데이터가 있는지’에 대한 참조 정보만 제공할 뿐입니다.
다시 말하면, 각 쓰레드가 데이터를 큐에 저장하고, 이 데이터가 다른 쓰레드를 통해 처리되는 경우라도 데이터의 원본을 보존한 상태에서 안전하게 사용할 수 있으니 걱정하지 않으셔도 됩니다.
이 주제에 대해서는 아래의 유사한 질문과 답변을 참조하시면 더 이해가 쉬울 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아 그럼 TLS을 통해 쓰레드가 고유한 SendBuffer를 가지고 있는데 Open과 Close를 통해서 고유한 SendBuffer의 _buffer 의 일부분을 찝어서
Send를 해주었고 이는 원본자체는 특정 쓰레드의 고유한 영역이지만 ArraySegment특성상 원본 배열을 [참조]하기 때문에 읽어올 수 있는거고, 단지 읽기만 하니까 문제는 없다. 이말인가요?