인프런 커뮤니티 질문&답변

한종훈님의 프로필 이미지
한종훈

작성한 질문수

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

Session #3

send와 lock

작성

·

265

1

안녕하세요 

강의 수강중 궁금증이 생겨서 질문 올립니다.

 

제가 제대로 이해한것이 맞다면

_sendBuff에 enqueue를 하는 부분 자체에 lock이 걸려있고

그 안에 RegisterSend가 실행되는 조건인 _pendingList에 add가 되는 유일한 조건이 RegisterSend인 상태인데 

 

이러한 상황에서 SendQueue에 접근할 때 "다른 프로세스에서 미리 접근만 하고 아직 registerSend를 하지 않는 상황"이 존재할 수  있는지요

 

sendQueue에 접근 ->   SendAsync 이라는 큰 틀 사이사이에 멀티쓰레드를 고려한 여러가지 안전장치들이 모두 시작점의 lcok에 걸려있어서 그 의미가 없어지는것이 아닌가 하는 생각이 듭니다.

 

감사합니다

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

그 안에 RegisterSend가 실행되는 조건인 _pendingList에 add가 되는 유일한 조건이 RegisterSend인 상태인데

네 이건 맞지만, 간과하면 안되는 부분은
_socket.SendAsync() 부분이 비동기 함수라는 점입니다.
pending이 true라면, 나중에 네트워크 전송이 완료되는 시점에서
(보통) 다른 쓰레드를 통해 OnSendCompleted가 호출되겠죠.

OnSendCompleted 내부에서도 _sendArgs, _pendingList를 건드리고 있으니
RegisterSend, OnSendCompleted에 각각 lock을 잡아주지 않는다면
멀티쓰레드 이슈가 생길 수 있습니다.

 

 

0

한종훈님의 프로필 이미지
한종훈
질문자

답변 감사합니다.

 

그렇다면 send를 하는 거의 모든 부분에 lock이 결려있는 상태인데 

성능을 고려했을때 lock을 거는 부분은 적을수록 적절하다고 알고있습니다.

여기서 lock을 잡는 부분을 줄이거나 좀더 최적화를 하려는 시도가 의미가 있나요 아니면 이러한 구조는 이미 오랜시간 최적화가 끝난 결과물이므로 이대로 받아들이는것이 좋나요?

Rookiss님의 프로필 이미지
Rookiss
지식공유자

질문이 이상합니다.
[최적화가 끝난 결과물]이란 존재하지 않고
어차피 프로젝트마다 다 다르게 구현합니다.

한종훈님의 프로필 이미지
한종훈
질문자

감사합니다

한종훈님의 프로필 이미지
한종훈

작성한 질문수

질문하기