ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🧰 C++11 std::atomic 표준 라이브러리
    프로그래밍/C/C++ 2023. 6. 1. 09:13

    std::atomic은 멀티스레딩 환경에서 안전하게 변수를 접근할 수 있도록 하는 C++의 표준 라이브러리 클래스입니다. 이 클래스는 다양한 변수 타입(int, float, bool 등)에 대한 원자적인 조작(atomic operation)을 제공합니다.

    💡 std::atomic의 특징

    std::atomic은 다음과 같은 특징을 가지고 있습니다.

    • 멀티스레딩 환경에서 안전하게 변수를 접근할 수 있습니다. 이 클래스를 사용하면 변수에 대한 동기화를 수동으로 처리할 필요가 없으므로, 코드를 간단하게 유지할 수 있습니다.
    • std::atomic은 원자적인 조작(atomic operation)을 제공합니다. 원자적인 조작은 하나의 스레드에서 실행 중인 코드가 중단되지 않고, 전체적으로 원자적으로 실행되는 코드 블록입니다. 따라서, 다른 스레드에서 접근하는 경우에도 안전합니다.
    • 다양한 변수 타입(int, float, bool 등)을 지원합니다. std::atomic은 모든 기본 데이터 타입(int, float, bool 등)을 지원하고, 사용자 정의 클래스도 지원할 수 있습니다.
    • 특정 메모리 모델을 사용할 수 있습니다. std::atomic 클래스는 C++11에서 도입된 메모리 모델을 사용하여, 다양한 플랫폼에서 일관된 동작을 보장합니다.

    🔧 std::atomic 사용 예시

    예제 1: std::atomic 사용하지 않은 경우

    아래 코드는 std::atomic을 사용하지 않은 경우를 보여줍니다.

    #include <iostream>
    #include <thread>
    
    int num = 0;
    
    void increment() {
        for(int i = 0; i < 100000; ++i) {
            num++;
        }
    }
    
    int main() {
        std::thread t1(increment);
        std::thread t2(increment);
    
        t1.join();
        t2.join();
    
        std::cout << "num: " << num << std::endl;
        return 0;
    }
    
    

    위 코드에서는 num 변수를 두 개의 스레드에서 동시에 접근하고 있습니다. 이 경우, 스레드 간 동기화 메커니즘이 없기 때문에 num 변수의 값이 예측할 수 없게 변할 수 있습니다.

    예제 2: std::atomic 사용한 경우

    아래 코드는 std::atomic을 사용하여 num 변수를 원자적으로 증가시키는 예제입니다.

    #include <iostream>
    #include <atomic>
    #include <thread>
    
    std::atomic<int> num = 0;
    
    void increment() {
        for(int i = 0; i < 100000; ++i) {
            num++;
        }
    }
    
    int main() {
        std::thread t1(increment);
        std::thread t2(increment);
    
        t1.join();
        t2.join();
    
        std::cout << "num: " << num << std::endl;
        return 0;
    }
    
    

    위 코드에서는 num 변수를 std::atomic<int> 타입으로 선언하여, 변수에 대한 원자적인 증가 연산을 수행하고 있습니다. 따라서, 멀티스레딩 환경에서 안전하게 num 변수의 값을 증가시킬 수 있습니다.

    🤔 사용해야 할 때와 사용하지 말아야 할 때

    std::atomic 클래스를 사용해야 할 때는, 멀티스레딩 환경에서 변수에 대한 안전한 접근을 보장해야 하는 경우입니다. 따라서, 변수에 대한 동기화 메커니즘을 직접 작성하기 어렵거나, 멀티스레딩 환경에서 발생할 수 있는 문제를 예방하고자 할 때 std::atomic 클래스를 사용해야 합니다.

    반면에, std::atomic 클래스를 사용하지 말아야 할 때는, 변수에 대한 동기화가 필요하지 않은 경우입니다. 예를 들어, 단일 스레드에서 실행되는 프로그램에서는 std::atomic 클래스를 사용할 필요가 없습니다.

    📚 참고 자료

    댓글

Designed by Tistory.