작성
·
532
0
Session#2 강의 시작부분에 설명해주신 내용에서,
SEssion의 receive는 OnRecvCompleted()메서드에 여러 스레드가 동시다발적으로 들어가는 경우는 없다.
라고 하셨는데, 왜 그런지 이해를 못했습니다.
ServerCore의 OnAcceptHandler는 콜백함수라서 콜백함수는 다른 스레드가 생겨나서 실행이 된다고 들었던 것 같은데,
그렇다면 두 스레드가 OnAcceptHandler에서 Session.Start()를 해버리면 OnRecvCompleted()메서드를 두 스레드가 동시에 실행할 경우가 생기지 않나요?
답변 4
0
아래 코드처럼 Session session = new Session(); 이후에 그 한 세션의 session.Start를 여러 스레드가 수행하는 경우는 어떻게 되는건가요?
0
0
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);
}
}
0
동시에 2 쓰레드가 OnRecvCompleted를 호출할 수 있습니다.
하지만 호출된 다수의 OnRecvCompleted가 동일한 Session을 대상으로 호출될 수는 없다는게
핵심입니다. 그렇다면 락 처리가 필요 없다는 것이죠.
낚시대에 늘 비유를 하는데 낚시대를 하나만 던졌으면,
낚시꾼이 아무리 많더라도 동일한 낚시대는 한번만 끌어올릴 수 있겠죠
new Session();으로 새로 동적 생성을 하고 있기 때문에
동일한 Session일 수가 없습니다.