Atomic 연산에 한해, 모든 쓰레드가 동일 객체에 대해서 동일한 수정 순서를 관찰!
Atomic<Typename T>
를 통해 선언한 Atomic
객체는 원자적으로 load와 store가 가능한데, 이때 유일하게 지켜지는 것은 동일 객체에 대해 동일한 수정 순서를 관찰한다는 점이다!
어떤 한 데이터에 대해 여러 쓰레드가 값을 가져가서 사용하고 읽을때, 각 쓰레드가 관찰
한 데이터의 값은 다를 수 있다.
예를 들어, 1->3->5->9 이런식으로 흘러가는 데이터가 있을때, 여러 쓰레드가 읽는 시간과 자신들이 그 데이터에 write한 결과에 따라 다르게 데이터 값이 나올 수 있다.
각 코어의 L1,L2캐시는 따로 존재하니 이런 일이 생긴다. 즉, 제대로 맞추려면 동기화를 해줘야 한다.
"다중 코어에서의 메모리 아키텍처, 캐쉬와 레지스터의 존재 및 컴파일러 성능 최적화에 따른 재배치 현상으로 인하여 일부 상태의 업데이트(쓰기) 작업이 끝난 뒤,
작업을 실행하는 쓰레드 외에 다른 쓰레드에게는 상태의 변경이 보이지 않는 상황이 발생한다."
Atomic타입을 일반적으로 쓸땐 memory_order_seq_cst가 디폴트 값으로 적용된다.
이게 생각보다 비싼 연산이긴 한데 인텔이나 암드의 x86(64) CPU의 경우 사실 거의 순차적 일관성이 보장되서 seq_cst를 강제해도 차이가 드라마틱하게 나진 않는다고 한다. 근데 ARM CPU는 꽤 차이난다고 하니 조심하자.