인프런 커뮤니티 질문&답변
sendQueue에 1개 이상 쌓이는 이유
작성
·
375
0
안녕하세요 선생님
디버깅을 해봤는데 생각한대로 잘되지않아서
_sendQueue 버퍼가 쌓이는 방식이 제가 이해한게 맞는건지 의문이 들어서 질문드립니다.
일단 send()에서 _sendQueue에 버퍼를 넣어주고 _sendRegistered를 true 변경후 RegisterSend()를 호출합니다. 그리고 _sendQueue를 모두 비운후 WSASend까지 성공을하면 send()에서 걸었던 lock이 해제가 됩니다.
그후에는 다른 쓰레드에서 동일한 세션으로 send를 요청할경우 send()를 받고 _sendQueue에 버플 넣을수는 있으나 ProcessSend()에서 _sendRegistered를 false로 변경하지않았을경우 send()에서 RegisterSend()를 호출할수 없습니다. 그후 기존에 send가 진행되고 있던 쓰레드가 실행될경우 ProcessSend()에서 바로 RegisterSend()함수를 호출하게 되고 그때는 _sendQueue에 쌓여있는 버퍼를 볼수있게 됩니다.
제가 이해한게 맞는건가 싶어 질문드립니다.
퀴즈
네트워크 라이브러리 설계에서 `IocpCore` 클래스의 주된 역할은 무엇일까요?
세션 연결 상태를 관리합니다.
비동기 I/O 작업 완료를 효율적으로 알리고 스레드에 분배합니다.
패킷 데이터 인코딩/디코딩을 담당합니다.
기본 소켓 유틸리티 함수들을 제공합니다.
답변 1
0
네 맞습니다.
실제 전송 함수는 딱 1개 쓰레드만 담당하게 하려고 저렇게 한겁니다.
저렇게 하지 않고 매 번 실제 전송하는 코드도 본 적이 있었는데
그럴 경우 sendEvent를 재사용하면 안 되고 매 번 새로 만들어줘야 합니다.
개인적으로 MMO 기준으로는 반응속도보다는 효율성이 더 중요하니, 전자가 낫다고 생각합니다.





