• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

receiveasync 질문입니다.

21.04.11 19:17 작성 조회수 381

0

제가 이해한 바로는 receiveasync를 쓰게 되면 쓰레드풀에서 쓰레드를 하나 끌어와서 그 안에서 루프를 돌면서 데이터가 오는지 안오는지 체크하다가 온게 확인되면 args.Completed 를 invoke 시켜준다고 이해했는데요.

그럼 만약에 동접 10000명이 있는데 이들이 처음에 소켓에 연결하고 receiveasync 함수를 호출하면 쓰레드가 10000개가 생성되는 것 아닌가요?

그리고 만약 이 10000명이 send를 보내주기 전까지는 각각의 10000개의 쓰레드가 루프 안에서 블락되어 있는 상태 아닌가요?

답변 3

·

답변을 작성해보세요.

2

그럼 예를 들어서 한명의 클라이언트만 존재한다고 했을 때 맨 처음 코드부터 receiveasync코드를 호출하고 또 더 나아가서 실제로 recv가 완료되기 전까지는 메인쓰레드 하나만 진행되고 있다가 recv가 완료되면 그 때 쓰레드풀에서 쓰레드가 잠깐 개입해서 args.Completed를 invoke 해주고 빠져주는 건가요??

-> 네 그렇습니다.

근데 궁금한 것은 어떻게 메인쓰레드 혼자 로직을 진행하고 있는데 중간에 어떤 일이 완료된 것에 대해서 알림을 받을 수 있는 건가요?? 그게 따로 쓰레드로 빼서 처리되고 있던 것도 아닌데...
혹시 ReceiveAsync함수가 내부적으로 어떻게 돌아가는지 알 수 있는 방법이 없나요??

-> 운영체제가 해줍니다. 메인쓰레드 혼자 로직을 실행한다고는 하나
주기적으로 커널 모드로 돌아가서 Windows 운영체제가 관리를 해주고 있죠.

2

제가 이해한 바로는 receiveasync를 쓰게 되면 쓰레드풀에서 쓰레드를 하나 끌어와서 그 안에서 루프를 돌면서 데이터가 오는지 안오는지 체크하다가 온게 확인되면 args.Completed 를 invoke 시켜준다고 이해했는데요.

-> 그게 아니고 실제 recv가 실제로 완료되면, 그 때 쓰레드풀에서 쓰레드가 개입해서 args.Completed를 invoke합니다. 경우에 따라 바로 완료되면 (pending == false) 그냥 이어서 처리를 해야 하구요.

그럼 만약에 동접 10000명이 있는데 이들이 처음에 소켓에 연결하고 receiveasync 함수를 호출하면 쓰레드가 10000개가 생성되는 것 아닌가요?

-> 아닙니다.

그리고 만약 이 10000명이 send를 보내주기 전까지는 각각의 10000개의 쓰레드가 루프 안에서 블락되어 있는 상태 아닌가요?


-> 아닙니다. 블락된건 Blocking 계열 함수고 Async는 비동기라서 예약을 하고 완료 통지를 따로 받는 겁니다.

0

shef님의 프로필

shef

질문자

2021.04.12

그럼 예를 들어서 한명의 클라이언트만 존재한다고 했을 때 맨 처음 코드부터 receiveasync코드를 호출하고 또 더 나아가서 실제로 recv가 완료되기 전까지는 메인쓰레드 하나만 진행되고 있다가 recv가 완료되면 그 때 쓰레드풀에서 쓰레드가 잠깐 개입해서 args.Completed를 invoke 해주고 빠져주는 건가요??
근데 궁금한 것은 어떻게 메인쓰레드 혼자 로직을 진행하고 있는데 중간에 어떤 일이 완료된 것에 대해서 알림을 받을 수 있는 건가요?? 그게 따로 쓰레드로 빼서 처리되고 있던 것도 아닌데...
혹시 ReceiveAsync함수가 내부적으로 어떻게 돌아가는지 알 수 있는 방법이 없나요??