최대 1 분 소요

개요

  • atomic
    • 산술 연산들을 원자적으로 수행해주는 템플릿 클래스
    • 원자적
      • 연산 사이에 다른 연산을 수행하지 않음
    • 기본 자료형에 대해선 atomic_xxx로 typedef 되어 있음
  • memory order
    • 주위 다른 메모리들의 재배치 방식 지정 가능
    • memory_order_relaxed
      • 재배치 가능
    • memory_order_consume
    • memory_order_acquire
      • 해당 연산 아래에 있는 연산들은 해당 연산 위로 재배치 금치
    • memory_order_release
      • 해당 연산 위에 있는 연산들은 해당 연산 아래로 재배치 금지
    • memory_order_acq_rel
      • memory_order_acquire와 memory_order_release를 모두 만족
    • memory_order_seq_cst
      • 순차적 일관성(재배치x) 보장


예제

  • 코드
    #include <atomic>
    #include <iostream>
    #include <type_traits>

    using namespace std;

    int main() {
        atomic<bool> a(true);
        atomic_bool b(false);

        cout << a << endl;
        cout << a.load() << endl;
        a.store(false);
        cout << a.load(memory_order_release) << endl;
        a = true;
        cout << a.load(memory_order_acquire) << endl;

        cout << "------" << endl;

        atomic_int c(1);
        c.fetch_add(1);
        cout << c.load() << endl;
        c.store(5);
        cout << c.load() << endl;
        c.fetch_sub(2);
        cout << c.load() << endl;

        return 0;
    }
  • 실행 결과
    1
    1
    0
    1
    ------
    2
    5
    3