Updated:

less than 1 minute read

개요

  • 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