inflearn logo
강의

Course

Instructor

[MMORPG Game Development with C++ and Unreal Series] Part 4: Game Server

Reader-Writer Lock

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

98

jjun

19 asked

0

32비트짜리 threadID를 비트 연산으로 16비트 옮겨준뒤 짤라준 것을 WriteFlag에 담는 과정에서 손실이 일어나는거 아닌가요?

image.png

 

그래서 현재 ThreadID와 _lockFlag의 WriteFlag를 다시 16비트 옮겨준 값이랑 비교했을 때 일치하지 않는 문제가 발생할 수 있지 않나요?
강의 18:40초입니다.

( ThreadID를 16비트로 관리하지 않는 이유는 또 무엇인가요??? )

네트워크 MMORPG windows-server

Answer 2

0

Rookiss

어차피 쓰레드는 많아야 최대 30개 수준입니다.
따라서 int8, int16, int32 뭐로 관리하더라도 상관없고
사실 손실 문제는 걱정할 필요가 없습니다.
손실은 무조건 일어나는 것이 아니고, 아주 큰 숫자를 캐스팅할 때나 일어나는 것입니다.

0

jjun

답변 감사드립니다!!

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 넘블님.

강의 중 32비트 threadID를 비트 연산을 통해 16비트로 변환하고 WriteFlag에 적용하는 과정에서 데이터 손실에 대한 우려가 있으신 것 같네요. 해당 문제는 비트 마스킹과 시프트 연산을 적절히 사용하여 해결할 수 있습니다.

비트 연산에서의 데이터 관리

  1. 비트 시프트 및 마스킹: 32비트 값을 16비트로 줄이는 과정에서 비트 시프트(<<)와 마스킹(& WRITE_THREAD_MASK)을 사용하여 상위 비트에 필요한 값을 정확히 저장할 수 있습니다. 즉, 필요한 부분만 남기고 나머지를 제거하며, 의도한 대로 데이터가 잘 관리될 수 있도록 합니다.

  2. 데이터 비교:

    • lockThreadId는 현재 LThreadId와 비교하기 위해 16비트 시프트 후 WRITE_THREAD_MASK로 마스킹됩니다. 이는 threadID가 고유하게 저장되고, 중복없이 비교되는 것을 의미하며, 만약 정확히 동일한 threadID를 사용하는 스레드가 다시 접근할 경우에만 성공적으로 연산됩니다.
  3. 16비트 사용의 이유:

    • 메모리 절약: 전반적인 성능 개선을 위해, 모든 threadID에 정수형 전체(32비트)를 사용하는 대신, 충분한 정보가 전해진다면 16비트만을 사용하는 것이 가능합니다.
    • 시스템의 요구사항에 맞춘 설계로, threadID의 범위가 16비트 내에서 충분한 경우 효율적일 수 있습니다.

자세한 내용과 실질적인 코드 예제는 아래의 링크에서 확인하실 수 있습니다:
- WriteLock 함수의 desired값 초기화 관련 질문

이 설명이 문제를 이해하는 데 도움이 되기를 바랍니다. 해당 주제와 관련하여 추가적인 질문이 있으시면 언제든지 문의해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

0

55

2

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

0

95

1

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

0

49

1

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

0

74

2

성능 테스트 결과

0

97

2

게임 서버 Stateful, Stateless 진로 고민

0

113

1

WaitOnAddress와 Sleep의 차이 질문

0

78

1

궁금한거 있습니다.

0

78

2

JobTimer 구동 스레드

0

103

2

TryPop() 동작 관련 질문

0

78

1

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

0

142

2

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

0

70

1

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

0

81

2

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

0

137

2

mutex와 sleep 차이점

0

114

1

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

0

149

2

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

0

91

1

공부법 관련해서

0

179

2

MakeShared 함수 관련

0

110

1

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

0

140

2

운영체제관련 질문입니다

0

127

1

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

0

114

2

메모리 풀 질문있습니다.

0

119

1

메모리 풀 질문있습니다.

0

79

1