1. 원자성 문제

멀티 스레드 환경에서 원자성이란, 공유 자원에 대한 작업의 단위를 더 이상 쪼갤 수 없이 하나의 연산인 것 처럼 동작하는 것을 의미한다.

즉, 멀티 스레드 환경에서 한 스레드가 기계 명령어를 수행하는 동안에 다른 스레드가 개입하여 같은 공유 변수에 기계 명령어를 수행할 수 있으므로 값이 꼬이게 된다. → race condition 발생!

그럼 예시를 살펴보자.

Untitled

Untitled

amount 값이 1씩 증가해서 40이 될 것으로 기대했지만 실제론 그렇지 않다.

amount++ 작업은 사실 3개의 기계어 명령어로 동작한다.

  1. amount 읽기(CPU cache memory)
  2. amount 수정(CPU cache memory)
  3. amount 덮어 쓰기(main memory)

값을 증가시킨 amount(29)을 쓰기 전에 다른 스레드가 증가전 amount(28)을 읽게되고, 두 스레드가 증가시킨 amount(29) 값이 동일하게 되는 것이다.

Untitled


2. 가시성 문제