atomiccasmemory-ordering
Atomic 연산과 CAS, memory ordering을 설명해 주세요
- 예상 시간
- 10분
30초 답변
꼬리질문
조금 더 깊게 물어본다면
답변 뒤에 이어질 수 있는 질문들을 하나씩 열어볼 수 있어요.
CAS는 어떤 인자를 비교하나요?
CAS 기반 코드는 왜 retry loop가 자주 나오나요?
ABA 문제는 무엇인가요?
volatile과 atomic은 같은가요?
memory barrier는 왜 필요한가요?
부가 설명
공유 변수 하나를 증가시키는 문제는 atomic으로 깔끔하게 해결되는 것처럼 보입니다. 하지만 lock-free 코드로 갈수록 어려운 부분은 단일 연산보다 그 연산 주변의 순서입니다. 한 스레드가 데이터를 채운 뒤 ready flag를 true로 바꿨는데, 다른 스레드에는 flag가 먼저 보이고 데이터는 아직 안 보이는 식의 문제가 생길 수 있습니다.
memory ordering은 이런 가시성 계약을 정합니다. 모든 것을 가장 강하게 묶으면 동작은 단순해지지만 성능 비용이 생길 수 있고, 너무 느슨하게 잡으면 드문 타이밍 버그가 납니다. atomic은 순서 문제까지 자동으로 모두 해결하지 않습니다. CAS와 acquire/release는 서로 다른 문제를 다룹니다.
한 줄 정리
Atomic은 끼어들 수 없는 연산을, CAS는 비교 후 교체를, memory ordering은 그 연산들이 보이는 순서를 다룹니다.