원자성을 가진 값 더하기를 한다면 우리는 이렇게 연산할 수 있습니다.
int r = AtomicAdd(&a, 3);
이 코드를 다시 풀어서 설명하자면 이렇습니다. “a에 뭐가 들었는지는 모르지만 여하튼 우리는 거기에 3을 더할 것이다. 우리가 원하는 것은 a에 정확히 3이라는 값이 추가되는 것이다. 그리고 추가된 후 a가 뭔지 알고 싶다.”
이렇게 하면 과거에 a에 무엇이 들었는지 모르더라도 a에 3이 추가되는 것을 보장할 수 있으며, a에 3을 추가한 후 무슨 값이든 얻어 올 수 있습니다. 그러나 a에 3을 더한 후의 값을 얻어 온 지금 시점에서 a가 여전히 그 값을 유지한다는 보장은 없습니다. 언제든지 다른 스레드로 변경될 수 있기 때문입니다. 이는 잠금의 전염성과 관련된 문제로 1.16절에서 설명하겠습니다.
원자성을 가진 값 맞바꾸기는 변수 값과 내가 원하는 값을 서로 맞바꾸는 것입니다.
int r = AtomicExchange(&a, 10);
이렇게 함으로써 a의 과거 값이 r에 채워지고, a에는 10이 들어갑니다.
원자성을 가진 조건부 값 맞바꾸기는 “변수 값이 특정 값일 때만 그 변수에 내가 원하는 값을 넣어라.”입니다. 예를 들어 다음 코드는 “a가 10이 들어 있을 때만 100으로 바꾸어라.”입니다.
int r = AtomicCompareExchange(&a, 10, 100);
이 코드의 리턴 값은 a를 바꾸기 전 값입니다. 리턴 값이 10이라면 a는 성공적으로 100으로 바뀌었다는 의미입니다. 그런데 왜 여기에는 “그냥 값을 넣어라.”라는 기능이 없을까요?