작성
·
287
0
안녕하세요 선생님
디버깅을 해봤는데 생각한대로 잘되지않아서
_sendQueue 버퍼가 쌓이는 방식이 제가 이해한게 맞는건지 의문이 들어서 질문드립니다.
일단 send()에서 _sendQueue에 버퍼를 넣어주고 _sendRegistered를 true 변경후 RegisterSend()를 호출합니다. 그리고 _sendQueue를 모두 비운후 WSASend까지 성공을하면 send()에서 걸었던 lock이 해제가 됩니다.
그후에는 다른 쓰레드에서 동일한 세션으로 send를 요청할경우 send()를 받고 _sendQueue에 버플 넣을수는 있으나 ProcessSend()에서 _sendRegistered를 false로 변경하지않았을경우 send()에서 RegisterSend()를 호출할수 없습니다. 그후 기존에 send가 진행되고 있던 쓰레드가 실행될경우 ProcessSend()에서 바로 RegisterSend()함수를 호출하게 되고 그때는 _sendQueue에 쌓여있는 버퍼를 볼수있게 됩니다.
제가 이해한게 맞는건가 싶어 질문드립니다.
답변 1
0
네 맞습니다.
실제 전송 함수는 딱 1개 쓰레드만 담당하게 하려고 저렇게 한겁니다.
저렇게 하지 않고 매 번 실제 전송하는 코드도 본 적이 있었는데
그럴 경우 sendEvent를 재사용하면 안 되고 매 번 새로 만들어줘야 합니다.
개인적으로 MMO 기준으로는 반응속도보다는 효율성이 더 중요하니, 전자가 낫다고 생각합니다.