• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Session #2 내용중 왜 스레드가 동시다발적으로 접근 불가능한지 질문

23.03.01 13:30 작성 조회수 380

0

Session#2 강의 시작부분에 설명해주신 내용에서,

SEssion의 receive는 OnRecvCompleted()메서드에 여러 스레드가 동시다발적으로 들어가는 경우는 없다.

 

라고 하셨는데, 왜 그런지 이해를 못했습니다.

ServerCore의 OnAcceptHandler는 콜백함수라서 콜백함수는 다른 스레드가 생겨나서 실행이 된다고 들었던 것 같은데,

 

그렇다면 두 스레드가 OnAcceptHandler에서 Session.Start()를 해버리면 OnRecvCompleted()메서드를 두 스레드가 동시에 실행할 경우가 생기지 않나요?

답변 4

·

답변을 작성해보세요.

0

jiw720님의 프로필

jiw720

질문자

2023.03.04

아래 코드처럼 Session session = new Session(); 이후에 그 한 세션의 session.Start를 여러 스레드가 수행하는 경우는 어떻게 되는건가요?

0

jiw720님의 프로필

jiw720

질문자

2023.03.04

감사합니다. 그런데 만약 이렇게 동일한 session을 start하게된다면 같은 OnRecvCompleted()메서드에 진입하게되는 것 아닌가요?

0

jiw720님의 프로필

jiw720

질문자

2023.03.04

 static void OnAcceptHandler(Socket clientSocket)
        {
            try
            {
                Session session = new Session();
                session.Start(clientSocket);
                
                //스레드 1,2가 session.Start를 하도록 수행 

                //보낸다( string to byte 해서)
                byte[] sendBuff = Encoding.UTF8.GetBytes("welcome to mmorpg server");
                
                session.Send(sendBuff);

                Thread.Sleep(1000);
                session.Disconnect();
                
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.WriteLine(e);
            }
        }

new Session();으로 새로 동적 생성을 하고 있기 때문에
동일한 Session일 수가 없습니다.

0

동시에 2 쓰레드가 OnRecvCompleted를 호출할 수 있습니다.
하지만 호출된 다수의 OnRecvCompleted가 동일한 Session을 대상으로 호출될 수는 없다는게
핵심입니다. 그렇다면 락 처리가 필요 없다는 것이죠.
낚시대에 늘 비유를 하는데 낚시대를 하나만 던졌으면,
낚시꾼이 아무리 많더라도 동일한 낚시대는 한번만 끌어올릴 수 있겠죠