Atomic 연산은 여러 스레드들이 있을 때 하나의 공유 데이터에 대한 연산에서 한 스레드가 write 작업을 하고 있을 때, 다른 스레드가 read하는 것을 막기 위해서 하드웨어에서 지원하는 방법이다.
멀티스레딩의 문제는 다음과 같다.
가시성 문제 : 어떤 변수가 값을 읽어와 write 하는데 그게 100% 메모리에 저장한다는 보장이 없다. 즉, 캐시 메모리에(L1 Cache)만 들고 있는데 다른 프로세서가 메모리(L2 Cache)에서 데이터를 가져오는 것이다.
재배치 문제 : 최적화를 위해 컴파일러와 CPU는 코드 재배치를 진행한다.
Atomic 연산은 메모리 모델 정책 중 seq_cst를 주로 사용해서 가장 엄격하게 관리하는 것이고, 또는 acquire_realse 같은 경우 atomic 연산 이전의 명령어와 이후의 명령어를 섞는 것을 금지하고, CPU의 코드 재배치에서 atomic 연산을 해야지 그 다음 명령어들을 CPU에게 보여주는 방식이다.
Atomic 연산의 원리는 다음과 같다. 읽기 수정 쓰기 할 때까지 다른 스레드들의 메모리 버스를 잠근다. (여기서 메모리 버스를 잠근다는 것은 아예 잠그는 것이 아니라, 해당 atomic 연산을 하는 데이터에 대한 주소만의 접근을 막는다.) 여기서 메모리는 캐시 메모리를 포함하여 얘기한다. 각 코어는 버스로 연결되어 있고, 그 버스를 통해 캐시 메모리에 접근을 막는다. atomic 연산은 매우 빠르기 때문에 다른 코어의 연산에 영향을 미치지만 큰 영향은 미치지 않는다. 그리고 데이터를 동기화 시켜준다.