• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

_sendQueue 질문입니다.

22.06.05 21:20 작성 조회수 223

0

 
 
 
 
 
강의 마지막에 와서 뒤늦게 질문하는 느낌이 적지 않게 있는데,
 
재수강하면서도 여전히 긴가민가한 느낌이 있어서 질문드립니다.
 
#_sendQueue에는 버퍼가 언제 쌓이는가.
 
쓰레드 A가 제일 처음으로 Send 함수를 호출했다.
 
_sendQueue에 버퍼를 집어넣는다.
 
_pendingList.Count ==0 이라 RegisterSend가 호출된다.
 
이후 RegisterSend 안에 있는 SendAsync 함수로 pendingList를 송신한다.
 
그런데 SendAsync 함수가 true 떠서, 즉 송신을 실패했다면?
 
쓰레드 A는 Lock을 풀고 사라지고,
 
이어서 다른 쓰레드 B가 Send를 호출했을 때 PendingList의 Count는 0이 아니므로,
 
_ sendqueue에 버퍼만 집어넣고 쓰레드 B는 사라진다.
 
그 이후에 실패로 끝났던 SendAsync 함수가 콜백으로 OnSendCompleted 함수를 호출하면,
 
_sendQueue에 쌓인 버퍼가 한꺼번에 송신된다.
 
이런 흐름이라고 이해하면 될까요?
 
만약 이게 맞다면
 
SendQueue는 SendAsync 가 실패로 끝났을 때를 위한 안전 장치라고 생각해도 될까요?
 
 
마침 질문글 답변 중에 이런 부분이 있기는데 한데 확신이 없네요.
 
멀티쓰레드보다는 비동기 네트워크 쪽과 관련이 있는데,
SendAsync를 한다고 무조건 상대방이 받아준다는 보장이 없습니다.
로컬 환경에서야 pending이 거~~의 대부분 false로 뜨고 바로 완료 되겠지만
저 지구 반대편에 있는 사람이 접속했다면 이런저런 이유로
SendAsync가 바로 완료되지 않고 pending = true로 설정될 확률도 높습니다.
물론 말씀하신대로 Latency 뿐 아니라 Recv할게 너무 많아서 
상대쪽에서 처리를 못해서 그럴 수도 있구요.

답변 1

답변을 작성해보세요.

1

네 그런 이유가 맞습니다.
Send는 Recv와 다르게 여러 쓰레드에서 동시다발적으로 일어날 수 가 있는데
SendQueue를 사용하지 않고 무조건 전송할 경우 순서가 꼬일 수가 있습니다.
(1, 2, 3번 순서로 패킷을 보내려 했는데, 멀티쓰레드 이슈로 3, 1, 2로 보내진다거나...)
따라서 순차적으로 꼭 보내지도록 패킷 큐를 사용하는 것도 있고,
이미 누군가가 보낼 때 중복해서 보내지 않고 큐에만 밀어넣는 용도도 있는 것이죠.