작성
·
378
2
if (_locked == expected)
{
expected = _locked;
_locked = desired;
return true;
}
else
{
expected = _locked;
return false;
}
if 조건문에서 _locked == expected를 만족하면,
이미 두 변수의 값이 같은데
expected = _locked 코드를 추가로 넣어주는 이유가 따로 있나요?
답변 3
3
사실 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
3
[성공/실패와 무관하게 expected에는 100% 기존의 _locked 값이 들어간다]는 것을 표현하기 위해
넣은 것이고 어디까지나 '의사코드'이기 때문에 해당 부분은 빼셔도 됩니다.
1
답변 감사합니다! 한 가지 더 질문 드리고 싶습니다.
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 값이 들어간다]는 것을 표현하는 의미가 무엇인지 잘 모르겠습니다.
늦은 시간에도 친절하게 답변해주셔서 감사합니다!!