0Pricing
C++ Academy · 강의

비교 및 교환 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. std::atomic과 메모리 순서
  2. 비교 및 교환 CAS 패턴
  3. 잠금 없는 큐 구현
  4. 위험 포인터와 ABA 문제
← C++ Academy(으)로 돌아가기