비교 및 교환 CAS 패턴
compare_exchange_weak와 compare_exchange_strong으로 잠금 없는 갱신을 구현합니다.
비교 및 교환 CAS 패턴은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
CAS 기본 연산
비교 후 교환은 값을 원자적으로 읽고 비교한 다음 조건에 따라 씁니다. 대부분의 무잠금 알고리즘의 기반입니다.
C++ 비교 교환
std::atomic에는 두 가지 변형이 있습니다:
compare_exchange_strong(expected, desired)— 현재 값이 expected와 같으면 성공compare_exchange_weak(expected, desired)— 가짜로 실패할 수 있음
CAS 반복문의 구조
전형적인 CAS 반복문은 읽고, 계산하고, 쓰기를 시도합니다. 다른 스레드가 경쟁에서 이기면 다시 시도합니다.
std::atomic<int> a{0};
int old = a.load();
int next;
do {
next = compute_new(old);
} while (!a.compare_exchange_weak(old, next));원자적 갱신에 CAS 사용하기
새 값이 이전 값에 따라 결정될 때 CAS를 사용하십시오. 단순한 store는 동시 실행 중인 스레드의 갱신을 잃게 만들 수 있습니다.
// Atomic max
int current = a.load();
while (newval > current && !a.compare_exchange_weak(current, newval));무잠금 스택: Push
간단한 무잠금 스택의 push는 CAS를 사용하여 새 노드를 맨 앞에 배치합니다.
struct Node { int value; Node* next; };
std::atomic<Node*> head{nullptr};
void push(int v) {
Node* n = new Node{v, nullptr};
n->next = head.load();
while (!head.compare_exchange_weak(n->next, n));
}가짜 실패
compare_exchange_weak는 값이 일치하더라도 실패할 수 있습니다. 기반 명령의 실패가 허용되는 ARM과 같은 플랫폼에서 발생할 수 있습니다. 반복문 안에서는 이를 사용하고, 재시도 비용이 클 때는 strong을 사용하십시오.
갱신 패턴: 재설정
값이 변경되지 않은 경우에만 값을 알려진 상태로 재설정합니다.
int expected = 42;
if (a.compare_exchange_strong(expected, 0)) {
// a was 42 and is now 0
}구성 요소: 원자적 카운터
단순한 카운터에는 CAS 반복문보다 fetch_add가 더 간단하고 빠릅니다.
구성 요소: 원자적 플래그
단순한 불리언 플래그에는 std::atomic_flag가 std::atomic<bool>보다 가볍고 test_and_set을 지원합니다.
동시성 추론하기
무잠금 코드는 추론하기가 매우 어려운 것으로 유명합니다. 엄격한 테스트(TSan, 퍼징)와 가능한 경우 형식 모델을 사용하고, 이미 충분히 검증된 구현을 우선 사용하십시오.
CAS를 선택할 때
다음과 같은 경우 CAS를 사용하십시오:
- 여러 스레드가 동일한 값을 자주 갱신함
- 뮤텍스 경합이 병목으로 나타남
- 임계 영역이 매우 짧고 단순함
CAS를 사용하지 않을 때
다음과 같은 경우 CAS를 피하십시오:
- 갱신에 두세 개보다 많은 연산이 필요함
- 처리량보다 올바른 동작이 중요함
- 팀에 무잠금 프로그래밍 전문 지식이 부족함
빠른 확인
일반적으로 compare_exchange_weak를 반복문 안에서 사용하는 이유는 무엇입니까?
복습
비교 후 교환은 예상한 값과 일치할 때만 값을 원자적으로 갱신합니다. CAS 반복문은 잠금 없이 동시 갱신을 처리합니다. 반복문 안에서는 compare_exchange_weak를 사용하고, 한 번만 시도할 때는 strong을 사용하십시오.
자주 묻는 질문
“비교 및 교환 CAS 패턴” 강의는 무료인가요?
네 — “비교 및 교환 CAS 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“비교 및 교환 CAS 패턴”에서 뭘 배우나요?
compare_exchange_weak와 compare_exchange_strong으로 잠금 없는 갱신을 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“비교 및 교환 CAS 패턴” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- std::atomic과 메모리 순서
- 비교 및 교환 CAS 패턴
- 잠금 없는 큐 구현
- 위험 포인터와 ABA 문제