안녕하세요,
재재입니다.

atomic variable 에 대해 들어보셨나요?

이번 포스팅에서는,
mutex 와 함께 같이 사용하는 훌륭한 타입인 atomic 에 대해서 소개해 드리고,
c++ atomic variable 예제 코드를 제공해드릴게요.

(1) c++ atomic variable 이란?

atomic 어원 자체에서 오는 의미는 “원자적인” 이고,
원자성을 보장 할 수 있다 정도로 생각하시면 되겠습니다.

atomic variable 은 멀티 스레딩 환경에서,
유용하게 사용 할 수 있는 변수의 타입 입니다.

mutex 와 함께 사용 할 수 있으며, mutex 없이도 사용 할 수 있습니다.

https://en.cppreference.com/w/cpp/atomic/atomic

(2) c++ atomic variable method

c++ atomic variable method 는 종류가 다양합니다..

이번에는 atomic type 의 variable 에서 주로 사용하는 method 3가지를 뽑아볼게요.

  1. load – 현재 저장된 값을 가져올 때 사용
  2. store – 현재 atomic variable 의 값을 업데이트 할 때 사용
  3. exchange – 현재의 값을 업데이트 하면서, 이전의 값을 반환할 때 사용

위와 같은 method 등에서 원자적인 성질을 보장합니다.

(3) atomic method 를 사용하는 간단한 예제

exchange 와 load 를 사용하는 예제를 하나 가져왔습니다.

#include <atomic>
#include <cstdio>
...
std::atomic<bool> atomic_var{false};
if (!atomic_var.exchange(true)) {
    // this is the example when atomic_var has false.
    printf("atomic_var %s\n", atomic_var.load() ? "true" : "false");
}

이와 같이,
exchange 는 이전의 값을 활용하고 싶을 때 사용 할 수 있습니다.

특히, 위의 코드에서 만약 atomic_var 의 최초값이 true 라면,
if 문은 실행되지 않습니다.

(4) mutable mutex 예제 atomic 으로 대체하기

(mutable 에 대해 궁금하신 분들은 눌러주세요)

이전 포스팅에서 mutable mutex 예제 코드를 수정해보면 아래와 같습니다.

#include <atomic>
class SimpleExample {
public:
    void SetValue(int value) {
        this->example_.store(value);
    }
    int GetValue() const {
        return this->example_.load();
    }
private:
     std::atomic<int> example_{0};
};

(5) 결론

atomic variable 은 mutex 와도 함께 사용 할 수 있습니다.
특히, 원자적인 성질을 적용하면서 코드를 간단하게 짜고 싶을 때 유용합니다.

atomic 만으로 모든 thread 관련 코드를 작업 할 수는 없기 때문에,
적절한 시기에 올바른 코드를 작성해서 안전한 코드를 만들어보세요!

c++ atomic variable 예제 코드
태그:                             

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다