안녕하세요,
재재입니다.
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가지를 뽑아볼게요.
- load – 현재 저장된 값을 가져올 때 사용
- store – 현재 atomic variable 의 값을 업데이트 할 때 사용
- 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 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 관련 코드를 작업 할 수는 없기 때문에,
적절한 시기에 올바른 코드를 작성해서 안전한 코드를 만들어보세요!