ThreadLocal<SendBuffer> 질문
418
작성한 질문수 15
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를 여러 쓰레드에서 동시에 하더라도
서로 영향을 주지 않습니다. 버퍼를 열어서 패킷 정보를 기록하고 다시 닫는 부분까지는
개별적으로 하기 때문에 서로 충돌할 수가 없습니다.
C#에서의 RAII
0
71
3
TLS 질문드립니다.
0
82
2
SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.
0
76
2
Unity Span
0
100
2
XML, Dll 차이점
0
134
2
Session 질문입니다
0
98
1
Write Read 커서 키워드
0
88
1
더미 클라이언트 수에 따른 OnDisconnect 발생
0
85
2
네트워크 Send 전담 스레드 배치
0
115
2
UnhandledException 으로 서버 터지는 경우
0
104
2
컨텐츠 단, 엔진 단
0
118
1
질문 있습니다
0
93
2
C# 게임서버 3D MMORPG
0
159
2
유니티6 버전
0
108
2
receive하는 부분과 send하는 부분의 차이
0
154
2
커서의 위치의 중요성
0
111
2
C++ 전혀 모르는데 C# 서버
0
179
2
강의에 질문이 있습니다
0
94
2
멀티스레드 이해도 질문
0
108
1
500 vs 500
0
148
3
OnAcceptHandler 액션 함수
0
71
1
이 정도 서버의 객관적인 수준이 궁금합니다.
0
207
2
36. Serialization #3 에서 string (name) 코드 수정 질문
0
87
2
외부 컴퓨터와의 통신 방법이 궁금합니다
0
116
1





