inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Session #2

Send의 Lock

해결된 질문

385

조영웅

작성한 질문수 21

0

안녕하세요. 항상 질 좋은 강의 감사합니다! 복습중에 이해가 안가는 부분이 있어 질문 드립니다.

ServerCore의 Send부분 입니다.

제가 다음과 같이 이해를 했습니다.

Send를 호출해서 Lock을 걸은 스레드가 RegisterSend를 호출하고, 여기서 pending이 true 라면 그대로 종료하면서 Lock을 풀고, 이후에 Send를 호출한 스레드는 Queue에만 담고 종료한다. 나중에 다른 스레드로 OnSendCompleted가 비동기로 호출되면, Queue를 확인해서 일감이 있다면 바로RegisterSend를 호출해서 처리한다.

일단 이렇게 이해하는게 맞는건지 궁금합니다.

만약 맞다면 Queue에 일감이 있어 OnSendCompleted를 비동기로 실행한 스레드가 RegisterSend를 호출하면, Send에는 Lock이 안 걸려있는 상태 이니 RegisterSend가 동시에 두 번 호출될 수 있지 않나요?

C# unity network

답변 1

0

Rookiss


중첩해서 RegisterSend하는 상황을 피하기 위해,
_pendingList가 비어있을 때만 하고 있습니다.
미리 들어온 애가 RegisterSend하고 있다면,
뒤늦게 일감을 넣은 애는 조용히 빠져 나가고,

추후 먼저 처리하던 애가 그 부분을 같이 보내주게 될겁니다.

저는 MMO 특성상, 한번에 한 번의 SendAsync만 호출되는 것을 선호하지만,
사실 이 부분은 처리하는 방법이 다양하게 있습니다.
SendAsync와 같은 비동기 입출력 함수는 thread-safe하지 않아서 lock을 잡아줘야 하는 것은 맞지만,
그렇다고 해서 이전에 보내준 SendAsync의 완료 통지를 100% 기다렸다가
다음 SendAsync를 보내야 하는 것은 또 아닙니다.

TLS 질문드립니다.

0

52

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

55

2

Unity Span

0

81

2

XML, Dll 차이점

0

110

2

Session 질문입니다

0

83

1

Write Read 커서 키워드

0

78

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

73

2

네트워크 Send 전담 스레드 배치

0

100

2

UnhandledException 으로 서버 터지는 경우

0

88

2

컨텐츠 단, 엔진 단

0

106

1

질문 있습니다

0

78

2

C# 게임서버 3D MMORPG

0

152

2

유니티6 버전

0

100

2

receive하는 부분과 send하는 부분의 차이

0

134

2

커서의 위치의 중요성

0

105

2

C++ 전혀 모르는데 C# 서버

0

170

2

강의에 질문이 있습니다

0

88

2

멀티스레드 이해도 질문

0

96

1

500 vs 500

0

131

3

OnAcceptHandler 액션 함수

0

64

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

193

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

83

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

107

1

스핀락 질문.

0

111

2