멀티코어와 동기화
C 언어에서 스레드 간에 주고받는 플래그 변수에 volatile을 붙이는 것만으로는 동기화로 불충분한 이유로 올바른 것은?
- Avolatile을 붙인 변수는 다른 스레드에서 읽을 수 없게 되기 때문
- Bvolatile은 컴파일러 최적화를 억제할 뿐, 동작의 불가분성이나 다른 코어에서 보이는 순서를 보장하지 않기 때문
- Cvolatile을 붙이면 변수가 디스크에 저장되어 느려지기 때문
정답과 해설 보기
정답: B. volatile은 컴파일러 최적화를 억제할 뿐, 동작의 불가분성이나 다른 코어에서 보이는 순서를 보장하지 않기 때문
volatile은 변수의 읽기·쓰기를 생략하거나 합치지 않도록 컴파일러에 지시하는 것으로, 원래는 하드웨어 레지스터 조작을 위한 것입니다. CPU가 메모리 동작의 순서를 바꾸는 것은 막지 못하며, counter++와 같은 동작도 불가분이 되지 않습니다. C11이나 C++11 이후에는 _Atomic이나 std::atomic을 사용하면 불가분성과 메모리 순서가 모두 보장됩니다.
- A. 다른 스레드에서도 읽을 수 있습니다.
- B. 맞습니다. 스레드 간 동기화에는 아토믹 변수를 사용합니다.
- C. 디스크에 저장되는 일은 없습니다.