• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Send는 Lock이 있고 Recv에는 Lock이 없는 이유가 무엇인가요?

22.01.11 14:47 작성 조회수 296

1

좋은 강의를 만들어주셔서 감사합니다 😀

내용을 정리하다 궁금하게 있어 질문 남깁니다. 

 

Send에 Lock이 있는 이유는 멀티 쓰레드 환경에서 동시다발적으로 Send를 호출하는 것을 막기 위해서인데 

Recv에는 Lock이  없는 이유가 무엇인가요? 

 

Send는 우리가 원할 때 마다 호출해야 하는 반면 Recv는 송신버퍼에 데이터가 들어왔다는 이벤트가 있을때에만 호출하기 때문에 발생하는 차이인가요?

 

 

추가로, OnSendCompleted에서 Lock을 걸어야 하는 것도 잘 이해가 가지 않습니다. RegisterSend에서 호출된 경우는 Lock이 필요가 없다는 것이 이해가 갑니다. 

 

그치만 OnSendcompleted가 이벤트 핸들러라서 이벤트 완료됬을 시에만 실행할 수 있는데 그렇다면 여기에 다수의 쓰레드가 아닌, 하나의 쓰레드만 접근할 수 있지 않나요? 이벤트가 완료됬을 시 쓰레드 풀에서 하나의 쓰레드가 개입하여 이벤트핸들러를 처리한다고 들었습니다. 

 

어떤부분이 틀렸는지 알려주시면 감사하겠습니다. 

답변 1

답변을 작성해보세요.

2

Recv에는 Lock이 필요 없는 것이,
딱 1번에 1개의 쓰레드만 접근할 수 있습니다.
명시적으로 session.Recv() 요렇게 호출하는 개념이 아니기 때문이죠.
반면 Send는 어느 누구라도 session.Send(패킷) 이런 식으로 송신할 상황이 생기기 때문에
Lock 처리가 필요합니다.

OnSendCompleted가 1개만 완료 된다고는 하나,
내부적으로 접근하는 데이터가 다른 곳에서도 접근 가능하다면
역시나 Lock이 필요합니다.