`std::atomic`은 한 객체에 대한 읽기와 쓰기가 데이터 경합 없이 일어나게 한다. 뮤텍스보다 가볍다고 해서 모든 공유 상태를 원자 변수로 바꾸라는 뜻은 아니다.
카운터와 공개
#include <atomic>
std::atomic<int> visits{0};
void enter() {
visits.fetch_add(1, std::memory_order_relaxed);
}혼자 증가하는 통계에는 relaxed가 맞을 수 있다. 어떤 데이터를 만든 뒤 "준비됐다"는 플래그를 세우는 패턴은 다르다. 만든 쓰기가 플래그보다 먼저 보이지 않으면 상대는 빈 데이터를 읽는다. 그때는 플래그 쪽에 release 저장과 acquire 로드가 필요하거나, 그냥 뮤텍스를 쓴다.
순서의 이름
`memory_order_seq_cst`는 모든 스레드가 하나의 전체 순서로 원자 연산을 보게 하는 가장 강한 선택이고 기본값이다. acquire와 release는 짝을 이룰 때 그 쌍 사이의 쓰기를 공개한다. relaxed는 그 짝이 없다.
락 없는 자료구조를 직접 만들기 전에, 불변식을 뮤텍스로 지키는 버전을 먼저 둔다. atomic은 한 단어의 상태에는 잘 맞고, 두 변수가 함께 참이어야 하는 불변식에는 쉽게 구멍이 난다.
댓글
0개아직 댓글이 없습니다.