멀티코어와 동기화

C 언어에서 스레드 간에 주고받는 플래그 변수에 volatile을 붙이는 것만으로는 동기화로 불충분한 이유로 올바른 것은?

  1. Avolatile을 붙인 변수는 다른 스레드에서 읽을 수 없게 되기 때문
  2. Bvolatile은 컴파일러 최적화를 억제할 뿐, 동작의 불가분성이나 다른 코어에서 보이는 순서를 보장하지 않기 때문
  3. Cvolatile을 붙이면 변수가 디스크에 저장되어 느려지기 때문
정답과 해설 보기

정답: B. volatile은 컴파일러 최적화를 억제할 뿐, 동작의 불가분성이나 다른 코어에서 보이는 순서를 보장하지 않기 때문

volatile은 변수의 읽기·쓰기를 생략하거나 합치지 않도록 컴파일러에 지시하는 것으로, 원래는 하드웨어 레지스터 조작을 위한 것입니다. CPU가 메모리 동작의 순서를 바꾸는 것은 막지 못하며, counter++와 같은 동작도 불가분이 되지 않습니다. C11이나 C++11 이후에는 _Atomic이나 std::atomic을 사용하면 불가분성과 메모리 순서가 모두 보장됩니다.

  • A. 다른 스레드에서도 읽을 수 있습니다.
  • B. 맞습니다. 스레드 간 동기화에는 아토믹 변수를 사용합니다.
  • C. 디스크에 저장되는 일은 없습니다.
이 분야 연습하기 분야로 돌아가기

멀티코어와 동기화의 다른 문제

  1. C11의 _Atomic이나 C++11의 std::atomic에서 메모리 오더(memory order)를 지정할 수 있게 되어 있는 이유로 올바른 것은?
  2. 커다란 자료구조 전체를 하나의 락으로 보호하는 「거친 단위(coarse-grained) 락」과, 부분별로 다른 락으로 보호하는 「세밀한 단위(fine-grained) 락」을 비교한 설명으로 올바른 것은?
  3. 락프리(lock-free) 알고리즘의 성질로 올바른 것은?
  4. 임계 구역(critical section)에 대한 설명으로 올바른 것은?
  5. 병렬 프로그램에서 사용되는 배리어 동기화(barrier synchronization)에 대한 설명으로 올바른 것은?

이 분야의 비교