inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Reader-Writer Lock

다른 스레드가 write하고 있을 때 readlock 허용하나요?

207

dpcks5959

작성한 질문수 14

0

ReadLock 코드

uint32 expected = (_lockFlag.load() & READ_THREAD_MASK); 
if (_lockFlag.compare_exchange_strong(OUT expected, expected + 1)) 	return;

WriteLock 코드

const uint32 desired = ((LThreadId << 16) & WRITE_THREAD_MASK);

...

uint32 expected = EMPTY_FLAG;
if (_lockFlag.compare_exchange_strong(OUT expected, desired))
{
	_writeCount++;
	return;
}

Write할 때 lockFlag를 LThreadId << 16로 저장하기 때문에 첫 비트 ~ 15비트까지는 0으로 초기화가 될것입니다.

ReadLock에서는 Read용 Mask를 쓰는데 그럼 Write에서 초기화해준 lockFlag를 볼 수 없어서 항상 참값이 나와 expected + 1로 수정되는거 아닌가요??

 

다른 스레드가 Write하고 있을 때 Read를 허용하는것인지 궁금합니다.

네트워크 MMORPG windows-server

답변 2

0

Rookiss

아뇨 Write를 한 쓰레드가 아닌 다른 쓰레드의 Read는 허용하지 않습니다.

0

인프런 AI 인턴

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

주신 코드에서 ReadLockWriteLock의 상호작용에 관한 질문을 주셨군요. 비트 마스크와 compare_exchange_strong을 사용하는 점에서 혼란이 생길 수 있습니다. 이 질문에 대한 해결을 돕기 위해, 몇 가지 개념과 기존의 Q&A 링크를 공유드리겠습니다.

핵심 개념 요약:

  1. 비트 마스크 및 시프트:

    • LThreadId << 16로 상위 비트를 사용하여 WRITE_THREAD_MASK에 의해 특정 Thread ID 값을 저장합니다. 이런 방식으로 기존의 lockFlag의 하위 비트는 영향을 받지 않게 됩니다.
  2. ReadLock 처리:

    • ReadLock 코드에서의 READ_THREAD_MASK는 하위 비트만을 검사합니다. 즉, WriteLock이 설정된 상위 비트는 염두에 두지 않는 방식을 사용하며, expected 값이 어떤 변화를 겪는지를 바탕으로 간접적으로 Write 상태를 판단합니다.

따라서, 만약 다른 스레드가 Write Lock을 가지고 있을 경우에는 compare_exchange_strong이 실패하게 되고, 반복적으로 동일한 동작을 수행합니다. 결국 ReadLock이 성공하려면 WriteLock이 풀린 상태여야 합니다.

관련 질문 및 답변 링크:

다른 사용자가 비슷한 주제로 질문한 내용과 답변을 확인해 보시면 도움이 될 것입니다. 특히 명확한 예제와 설명이 첨부되어 있어 큰 도움이 될 것입니다:

이 질문과 답변은 reader-writer lock의 비트 연산과 마스킹의 사용에 대한 이해를 돕기 위해 작성된 좋은 사례입니다. 설명이 직관적이라면 이해하는 데 많은 도움이 될 것입니다.

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

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

0

63

2

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

0

112

1

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

0

62

1

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

0

82

2

성능 테스트 결과

0

103

2

게임 서버 Stateful, Stateless 진로 고민

0

121

1

WaitOnAddress와 Sleep의 차이 질문

0

83

1

궁금한거 있습니다.

0

82

2

JobTimer 구동 스레드

0

107

2

TryPop() 동작 관련 질문

0

81

1

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

0

148

2

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

0

73

1

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

0

86

2

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

0

139

2

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

0

101

2

mutex와 sleep 차이점

0

117

1

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

0

152

2

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

0

96

1

공부법 관련해서

0

183

2

MakeShared 함수 관련

0

114

1

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

0

144

2

운영체제관련 질문입니다

0

131

1

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

0

117

2

메모리 풀 질문있습니다.

0

124

1