멀티코어와 동기화
위의 두 스레드를 서로 다른 코어에서 동시에 실행한다(컴파일러에 의한 재배치는 없다고 가정). 순차 일관성에서는 일어나지 않지만 x86 등의 실제 CPU에서는 일어날 수 있는 결과는?
// 처음에는 x = 0, y = 0
// 스레드 1 // 스레드 2
x = 1; y = 1;
r1 = y; r2 = x;
- Ar1 = 1 그리고 r2 = 1
- Br1 = 0 그리고 r2 = 1
- Cr1 = 0 그리고 r2 = 0
정답과 해설 보기
정답: C. r1 = 0 그리고 r2 = 0
순차 일관성에서는 어느 한쪽의 쓰기가 먼저 수행되므로, 적어도 한쪽의 읽기는 1을 보게 됩니다. 그러나 실제 CPU에서는 x = 1이 일단 코어의 스토어 버퍼에 들어가고, 다른 코어에 보이기 전에 뒤따르는 읽기 r1 = y가 주기억장치나 캐시에서 먼저 값을 읽을 수 있습니다. 양쪽 코어에서 같은 일이 일어나면 둘 다 0을 읽습니다. 이를 막으려면 쓰기와 읽기 사이에 메모리 배리어를 넣습니다.
- A. 양쪽 쓰기가 먼저 끝나면 순차 일관성에서도 일어납니다.
- B. 스레드 1이 먼저 전부 끝나면 순차 일관성에서도 일어납니다.
- C. 맞습니다. 쓰기가 스토어 버퍼에 있는 동안 읽기가 먼저 진행됩니다.