반응형
blocking 및 non-blocing에 대해 알아보러 가기
1. 유저들이 많이 몰리는 경우 문지기들을 여러 설치 하는 방법
* 낚시대가 10개가 된다는 것으로 이해하면 쉬움
for( int i = 0 ; i < 10 ; i++ )
{
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);
RegisterAccept(args);
}
2. OnAccetCompleted가 어떻게 실행되는 걸까?
우리의 메인 쓰레드 부분은 계속 무한 반복을 하고 있는데 어떻게 OnAccetCompleted가 어떻게 실행되는지 알아보자
메인 쓰레드 부분
while (true)
{
;
}
작업자 쓰레드 부분
void OnAcceptCompleted(object sender, SocketAsyncEventArgs args)
{
if(args.SocketError == SocketError.Success)
{
//todo
_onAcceptHandler.Invoke(args.AcceptSocket);
}
else
Console.WriteLine(args.SocketError.ToString());
// 다음아이를 위한 등록
RegisterAccept(args);
}
우리의 코드에서는 Task나 Thread를 만든적이 없지만 AcceptAsync를 만들어가지고 콜백함수는 비동기 작업 쓰레드 풀 에서 호출되며 이를 통해 별도의 쓰레드에서 실행됨을 알 수 있다.
비동기 작업은 작업자 쓰레드 풀에서 관리되며, 작업이 요청시 쓰레드 풀 중 하나의 쓰레드가 할당되어 작업이 처리된다. 작업 완료시 해당 쓰레드는 다음 작업을 처리하기 위해 풀로 반환된다.
만약 OnAcceptCompleted와 Main쓰레드가 동시에 같은 데이터를 건드리면 어떻게 될까?
RaceCondition문제가 발생하게 된다.
그러므로 작업자 쓰레드 부분이 멀티쓰레드로 실행이 될 수 있다는 것을 염두하자
non - blocking 코드 보러 가기
참고 : 본 내용은 MMORPG PART4 강의를 수강하여 작성하였습니다.
https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4
반응형
'cs공부 > 네트워크프로그래밍' 카테고리의 다른 글
네트워크 프로그래밍 - C# Non - blocking을 사용한 Server 소켓프로그래밍의 Send (0) | 2023.07.07 |
---|---|
네트워크 프로그래밍 - C# Non - blocking을 사용한 Server 소켓프로그래밍의 Receive (0) | 2023.07.03 |
네트워크프로그래밍 - blocking(send등), non-blocking(BeiginSend,SocketAsyncEventArgs등) (0) | 2023.06.21 |
네트워크프로그래밍 - C# Non - blocking을 사용한 Server 소켓프로그래밍의 Listener (0) | 2023.06.21 |
네트워크 프로그래밍 - C# 간단한 blocking 사용한 Server 소켓프로그래밍 구현 (0) | 2023.06.19 |
댓글