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

마리님의 프로필 이미지

작성한 질문수

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

OnSendCompleted 에서 질문이 있습니다.

작성

·

101

·

수정됨

0

OnSendCompleted에 보면

if (_sendQueue.Count > 0)

    RegisterSend();

이 부분이 필요한 부분인지 궁금합니다.

 

void Send(byte[] sendBuff) 이 함수 안에서 이미 lock(_lock) 가 걸려있고

OnSendCompleted에서도 lock(_lock) 가 걸려있는데요. lock 로 인해서 한쪽이 작업중이면 다른 한쪽은 lock이 풀릴때까지 대기중일거 같아서요

 

 

답변 2

1

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

Register 이후 OnSendCompleted 사이에도
얼마든지 다른 패킷 전송 요청이 push될 수 있기 때문에 반드시 해줘야 합니다.
SendAsync는 바로 완료되는게 아니라는 것에 주의해야 합니다. (즉 대부분 pending = true)

0

안녕하세요, 인프런 AI 인턴입니다.
마리님의 질문과 관련된 구체적인 정보는 제공된 데이터에 포함되어 있지 않습니다. 하지만, 일반적으로 OnSendCompleted가 필요한 이유는 네트워크 프로그래밍에서 비동기 송신 작업이 완료된 후에 다음 작업을 예약하기 위해서입니다. 이 경우, _sendQueue.Count > 0 조건은 보낼 메시지가 대기열에 더 있는지 확인하여, 있다면 다음 메시지를 보내기 위해 RegisterSend() 함수를 호출합니다.

비동기 프로그래밍에서 송신 큐를 관리하는 것은 매우 일반적인 패턴입니다. 비록 Send 함수와 OnSendCompleted 콜백에서 같은 lock 객체를 사용하여 경쟁 조건(race condition)을 방지하는 것이 올바른 접근이지만, 이 lock은 송신 대기열에 대한 동시 접근을 관리하는 데 사용됩니다. 한 편에서는 메시지를 송신 대기열에 추가하고, OnSendCompleted에서는 송신 완료 후 대기열에서 메시지를 제거하거나 다음 메시지의 송신을 준비합니다. 따라서, 두 상황 모두에서 lock을 사용하는 것은 대기열의 상태를 안전하게 관리하기 위해 필요합니다.

그러므로, 여러분의 질문에 대답하자면, OnSendCompleted 내에서 if 조건문이 필요하며, 여기서의 lock 사용도 적절합니다. 하나의 작업이 lock을 획득하고 있을 때, 다른 작업은 대기 상태로 있게 되는 것은 맞지만, 이는 송신 대기열을 안전하게 관리하기 위한 필수적인 절차입니다.

마리님의 프로필 이미지

작성한 질문수

질문하기