inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

SpinLock

CAS 의사코드에 대해 질문드립니다.

493

eniak

작성한 질문수 9

2

		if (_locked == expected)
		{
			expected = _locked;
			_locked = desired;
			return true;
		}
		else
		{
			expected = _locked;
			return false;
		}

if 조건문에서 _locked == expected를 만족하면,

이미 두 변수의 값이 같은데

expected = _locked 코드를 추가로 넣어주는 이유가 따로 있나요?

network MMORPG windows-server

답변 3

3

Rookiss

사실 CAS 함수의 의사 코드를 제가 만든게 아니고,
그냥 그렇게 정의 되어 있는 것이라
왜 그렇게 되어 있는지를 고민해도 큰 의미가 없고
납득(?)하는 수밖에 없습니다.

하지만 질문을 받은 김에 생각을 해보자면,
CAS가 bool 뿐 아니라 int 버전도 엄연히 존재하는데
그 경우 CAS가 실패했을 때 [도대체 원본 값이 어떤 값이길래 실패했는지?]를
알고 싶은 상황이 생길 수도 있다고 봅니다.

while (_atomicInt.compare_and_strong(expected, desired) == false)
{
   // 여기서 expected 값을 확인하면, CAS 호출이 false로  뜬 바로 그 시점의 _atomicInt 확인 가능
   expected = TODO;
}

여담인데 저는 CAS가 저렇게 설계된 이유에 대해 궁금한 적이 한 번도 없었는데
동일한 질문을 두 번 연속으로 받은거보니
사람들마다 생각하는게 많이 다른 것 같네요 ㅎㅎㅎ (좋은 의미로)
https://www.inflearn.com/questions/245103

0

eniak

늦은 시간에도 친절하게 답변해주셔서 감사합니다!!

3

Rookiss

[성공/실패와 무관하게 expected에는 100% 기존의 _locked 값이 들어간다]는 것을 표현하기 위해
넣은 것이고 어디까지나 '의사코드'이기 때문에  해당 부분은 빼셔도 됩니다.

1

eniak

답변 감사합니다! 한 가지 더 질문 드리고 싶습니다.

		while (_locked.compare_exchange_strong(expected, desired) == false)
		{
			expected = false;
		}

CAS 함수가 false를 반환하는 동안 expected 값을 false로 재설정해주는데요.

_locked == true && expected == false 여서

else문이 실행하게 되면 expected에 true를 대입해주게 되는데

어차피 while 문을 타고 돌면서 바로 false로 값을 바꿔주는 것으로 이해했습니다.

그렇다면 if문이나 else문, 두 경우 모두 expected = _locked를 대입하는 실익이 없는 것 같은데

[성공/실패와 무관하게 expected에는 100% 기존의 _locked 값이 들어간다]는 것을 표현하는 의미가 무엇인지 잘 모르겠습니다.

writeLock을 잡을때 꼭 empty 상태여야하는 이유?

0

36

2

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

0

73

2

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

0

129

1

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

0

66

1

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

0

89

2

성능 테스트 결과

0

108

2

게임 서버 Stateful, Stateless 진로 고민

0

133

1

WaitOnAddress와 Sleep의 차이 질문

0

84

1

궁금한거 있습니다.

0

84

2

JobTimer 구동 스레드

0

108

2

TryPop() 동작 관련 질문

0

81

1

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

0

151

2

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

0

73

1

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

0

88

2

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

0

146

2

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

0

105

2

mutex와 sleep 차이점

0

120

1

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

0

161

2

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

0

98

1

공부법 관련해서

0

184

2

MakeShared 함수 관련

0

114

1

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

0

145

2

운영체제관련 질문입니다

0

132

1

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

0

120

2