패스잇
CS 기초 · 심화

락(Lock)을 사용하지 않고 스레드 안전한(thread-safe) 큐를 구현한다고 가정할 때, 어떤 기법들을 활용할 수 있으며, 특히 CAS(Compare-And-Swap) 연산을 사용하여 어떻게 원자성(atomicity)을 보장할 수 있는지 구체적인 예시와 함께 설명해 주십시오. 락 프리(lock-free) 방식의 장단점은 무엇입니까?

힌트 · CAS는 메모리 위치의 현재 값을 예상 값과 비교하여 같으면 새 값으로 원자적으로 업데이트합니다. ABA 문제는 태그드 포인터나 참조 카운터를 통해 해결할 수 있으며, 락 프리 방식은 데드락 위험을 줄이고 확장성을 향상시키지만 구현이 복잡합니다.

CAS (Compare-And-Swap)원자적 연산ABA 문제메모리 배리어락 프리 (Lock-Free)

모범답안

락 없이 스레드 안전한 큐를 구현하려면 CAS(Compare-And-Swap)와 같은 원자적 연산을 활용하는 락 프리(lock-free) 기법을 사용할 수 있습니다. CAS는 특정 메모리 위치의 값이 예상 값과 같을 때만 새 값으로 업데이트하는 연산으로, 이를 통해 여러 스레드가 동시에 데이터를 수정하려 할 때 발생할 수 있는 경쟁 상태를 방지하고 원자성을 보장합니다.

예를 들어, 큐의 tail 포인터를 업데이트할 때 CAS를 사용할 수 있습니다. 새로운 노드를 추가할 때, 현재 tail 포인터 값을 읽어온 후, 해당 값이 여전히 이전과 같다면 새 노드를 가리키도록 tail 포인터를 원자적으로 업데이트합니다. 만약 다른 스레드가 먼저 tail을 변경했다면 CAS 연산은 실패하고, 다시 현재 tail 값을 읽어와 시도하는 과정을 반복합니다.

CAS를 사용하면 데드락 위험이 없고 컨텍스트 스위칭 오버헤드가 줄어 확장성이 좋다는 장점이 있습니다. 하지만 ABA 문제(값은 같지만 실제로는 다른 시점에 변경된 경우)가 발생할 수 있으며, 이를 해결하기 위해 태그드 포인터나 참조 카운터 같은 추가적인 기법이 필요합니다. 또한, 락 프리 알고리즘은 구현이 복잡하고 디버깅이 어렵다는 단점이 있습니다.

읽었다면, 이제 직접 답해볼 차례예요

패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.

함께 보는 동시성 / 멀티스레딩 면접 질문

← 동시성 / 멀티스레딩 면접 질문 전체 보기