• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

Send의 Lock

21.07.30 22:46 작성 조회수 227

0

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

ServerCore의 Send부분 입니다.

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

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

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

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

답변 1

답변을 작성해보세요.

0


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

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

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