← 질문 목록
#409깊이 0
CAS 연산의 ABA 문제는 무엇인가?
자료구조 · 알고리즘깊이
답변 연습
내 답변 적어보기접힘
이 브라우저에 자동 저장 · 0자
모범답안 확인하기내 답변 뒤에 열어보세요
값이 A에서 B로 갔다가 다시 A로 돌아온 사이를 못 알아채는 것이다. 비교는 값만 보므로 그동안 아무 일도 없던 것과 구별되지 않는다.
| 순서 | 스레드 1 | 스레드 2 |
|---|---|---|
| 1 | 값 A를 읽는다 | 아무것도 하지 않습니다 |
| 2 | 멈춰 있다 | A를 B로 바꾼다 |
| 3 | 멈춰 있다 | B를 다시 A로 바꾼다 |
| 4 | A 그대로라 보고 바꾼다 | 아무것도 하지 않습니다 |
값만 보면 둘이 같다. 그래서 스레드 1의 교체는 성공하는데, 그사이 바뀐 것을 전제로 한 판단은 이미 틀어져 있다.
숫자만 다루면 대개 문제가 안 된다. 아프게 되는 것은 그 값이 무언가를 가리킬 때다. 같은 주소에 다른 것이 다시 놓이면 지워진 것을 붙들게 된다.
연결 구조에서 자주 나온다. 스택 꼭대기가 A였다가 A로 돌아왔는데 그 아래가 통째로 바뀌어 있으면 없는 자리를 가리킨다.
막는 방법은 값에 표를 붙이는 것이다. 값과 세대 번호를 한 낱말에 묶어 한 번에 비교하면 A로 돌아와도 번호가 달라 실패한다.
없앤 것은 아니다. 번호가 한 바퀴 돌면 같은 짝이 다시 나온다. 근본적으로 막으려면 회수 시점을 미루는 쪽을 쓴다.