inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Session #2

send 에 lock걸어 주는 것에 질문있습니다.

644

fhan

작성한 질문수 14

0

wsasend가 멀티쓰레드환경을 보장하지 않아 lock을 걸어준다고 하셨는데 어떤부분을 보장하지 않는 건가요?

버퍼문제라면 혹시 이번 수업의 코드는 임시로 event마다 독립적인 버퍼를 가지게 했으니  lock을 안걸어주어도 되나요?

 wsarecv 는 멀티쓰레드환경에서 문제가 발생하지 않나요?

network MMORPG windows-server

답변 1

0

Rookiss

앞으로 API 관한 부분은 늘 궁금함이 생기실텐데
항상 정답은 MSDN이나 구글에 있다고 보셔야 합니다.

https://social.msdn.microsoft.com/Forums/en-US/1f85557c-15f6-42b3-a8f7-1630b4099bb6/wsasend-from-multiple-thread-safe?forum=vcgeneral

0

fhan

https://stackoverflow.com/questions/28770789/is-calling-wsasend-and-wsarecv-from-two-threads-safe-when-using-iocp

여기서 보면 wsarecv도 멀티쓰레드환경에서 사용하면 위험하다고 하는데 수업코드에서는 recv할때는 lock이 안 결려있어서 질문드립니다

0

Rookiss

recv에서 락을 안 건 이유는, 애당초 RegisterRecv를 딱 1개만 걸어줬기 때문입니다.
따라서 2 쓰레드가 동시에 WSARECV를 호출할 경우의 수가 나오지 않습니다.
반면 Send는 밖에서 신나게 원하는 타이밍에 호출할 수 있어서 상황이 다릅니다.

0

fhan

ClientServiceRef service = MakeShared<ClientService>(

NetAddress(L"127.0.0.1", 7777),

MakeShared<IocpCore>(),

MakeShared<ServerSession>, // TODO : SessionManager 등

1);

이부분에서  마지막인자를 1로 설정했기 때문이라는 말씀이신거죠? 

이렇게 하면 실질적으로 한명의 유저만이 서버에 접속하게 되는 것이어서 lock을 안 걸어준 것이라고 이해하면 될까요?

0

Rookiss

아뇨 그 부분은 아닙니다. 동접이 5천명이라 하더라도,
한 유저에 대해서는 Recv를 한 번에 1번만 호출해주게 될 것이라는게 핵심입니다.
현재 구조에서 RegisterRecv -> ProcessRecv -> RegisterRecv -> ProcessRecv
이렇게 계속 왔다 갔다 하면서 패킷 수신이 이루어지고 있는데요.
이 부분은 제가 강의에서 낚시대에 비유를 많이 하곤 합니다.
낚시대가 유저마다 딱 1개만 있고, 이 낚시대를 바다에 던져서 물고기를 잡고,
물고기를 끌어올리고 다시 낚시대를 바다에 던지는 행동을 반복하겠죠.

RegisterRecv가 멀티쓰레드 환경에서 돌아간다고는 하나,
어차피 동일한 세션에 대해 RegisterRecv가 동시에 두 번 호출될 수 없습니다.
따라서 굳이 Recv할 때 락을 걸어줄 필요가 없는 것입니다.

0

fhan

음...... 그렇다면 RegisterSend는 동일한 세션에 대해 동시에 두 번 호출되는 경우가 있나요?

2

Rookiss

Send는 외부에서 원할 때 호출할 수 있으니, 
별도 안전 처리를 하지 않으면 여러번 호출될 수 있습니다.
따라서 락을 걸던, 이전 애가 보낼 동안에는
데이터를 보내지 않는 등 무엇이든 좋으니 보호를 해줄 필요가 있습니다.

0

fhan

이해됬습니다... 감사합니다^^

Memory Pool에서 오버플로우 질문입니다.

0

64

2

포토폴리오 및 진로 관련하여 고민입니다.

0

114

1

포토폴리오 관련 고민입니다.

0

63

1

실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.

0

82

2

성능 테스트 결과

0

103

2

게임 서버 Stateful, Stateless 진로 고민

0

122

1

WaitOnAddress와 Sleep의 차이 질문

0

83

1

궁금한거 있습니다.

0

82

2

JobTimer 구동 스레드

0

107

2

TryPop() 동작 관련 질문

0

81

1

로드맵 C#서버 C++서버 방향성 질문

0

150

2

스레드 id를 출력할떄 메인스레드 id도 출력되나요?

0

73

1

생명주기를 위한 의도적 복사

0

87

2

락프리의 실무에서 사용 질문

0

142

2

32bit threadID와 16비트 상위 WriteFlag에 대해

0

101

2

mutex와 sleep 차이점

0

118

1

실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다

0

153

2

Stomp Allocator의 Release함수에 대한 질문입니다.

0

96

1

공부법 관련해서

0

184

2

MakeShared 함수 관련

0

114

1

지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.

0

144

2

운영체제관련 질문입니다

0

131

1

send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.

0

118

2

메모리 풀 질문있습니다.

0

125

1