인프런 커뮤니티 질문&답변

eniak님의 프로필 이미지
eniak

작성한 질문수

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

SpinLock

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

작성

·

378

2

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

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

이미 두 변수의 값이 같은데

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

답변 3

3

Rookiss님의 프로필 이미지
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

eniak님의 프로필 이미지
eniak
질문자

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

3

Rookiss님의 프로필 이미지
Rookiss
지식공유자

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

1

eniak님의 프로필 이미지
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 값이 들어간다]는 것을 표현하는 의미가 무엇인지 잘 모르겠습니다.

eniak님의 프로필 이미지
eniak

작성한 질문수

질문하기