8. CPU의 원자성
이러한 스레드 안전성 문제가 발생하는 보다 근본적인 이유는,
CPU는 연산 처리를 수행할 때 원자적(Atomic)인 특성을 가지기 때문
즉, 더 이상 쪼개질 수 없는 하나의 기계 명령어를 수행할 때는 해당 명령어를 수행 종료할 때까지 인터럽트를 받지 않는다는 의미를 가짐
만약 반대로 CPU가 서로 다른 스레드에서 2개 이상의 기계 명령어를 처리하게 되는 경우에는 원자성이 보장되지 않기 때문에,
2개의 명령어들 사이에 불규칙적으로 인터럽트를 받아서 다른 스레드가 동작하는 상황이 발생할 수 있게 됨
→ 스레드 안전성 문제
a++은 단일 연산일까?
예를 들어서 다음의 코드가 있다고 가정할 때,
int a = 5;
a++;a++ 명령어는 더 이상 쪼개질 수 없는 단일 연산(Atomic)일까?
a++는 a = a + 1의 축약 표현으로,
a = a + 1은 단일 연산이 아닌 2개의 연산이라고 볼 수 있음
a + 1
a + 1한 값을 a 변수에 할당
→ 따라서 어떤 스레드가 a + 1연산을 수행 후,
a + 1의 연산 결과 값을 a에 대입하려는 찰나에
다른 스레드가 a + 1 연산을 먼저 수행하는 상황이 발생할 수도 있음

따라서 2개 이상의 기계 명령어가 원자적으로 하나의 명령어처럼 동작하게 하기 위해서는 동기화 기법을 적용해야함
Last updated on