멀티코어와 동기화

위 코드에서 스레드 1이 data를 준비한 뒤 flag로 알리고, 스레드 2가 flag를 확인한 뒤 data를 읽는다. 약한 메모리 일관성 모델의 CPU에서 스레드 2가 확실히 42를 읽기 위해 필요한 것으로 올바른 것은?

// 스레드 1         // 스레드 2
data = 42;           while (flag == 0) { }
flag = 1;            print(data);
  1. Adata의 타입을 int에서 long으로 바꾼다
  2. Bflag에 대한 쓰기를 release로, flag의 읽기를 acquire로 하여 순서를 보장한다
  3. C스레드 2의 루프 안에 아무것도 쓰지 않는다
정답과 해설 보기

정답: B. flag에 대한 쓰기를 release로, flag의 읽기를 acquire로 하여 순서를 보장한다

약한 모델에서는 스레드 1의 두 쓰기가 뒤바뀌어 보이거나, 스레드 2의 data 읽기가 flag 읽기보다 먼저 수행될 가능성이 있어, flag가 1인데도 data가 오래된 값 그대로인 일이 일어날 수 있습니다. flag에 대한 쓰기를 release로 하면 그 이전의 쓰기가 먼저 보이는 것이 보장되고, flag의 읽기를 acquire로 하면 그 이후의 읽기가 앞질러 수행되지 않게 됩니다.

  • A. 타입을 바꿔도 순서는 보장되지 않습니다.
  • B. 맞습니다. data의 쓰기가 flag보다 먼저 보이는 것이 보장됩니다.
  • C. 루프의 내용은 순서 보장과 관계없습니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 획득(acquire)과 해제(release)의 의미를 가진 메모리 동작에 대해 올바른 것은?
  2. C 언어에서 스레드 간에 주고받는 플래그 변수에 volatile을 붙이는 것만으로는 동기화로 불충분한 이유로 올바른 것은?
  3. C11의 _Atomic이나 C++11의 std::atomic에서 메모리 오더(memory order)를 지정할 수 있게 되어 있는 이유로 올바른 것은?
  4. 커다란 자료구조 전체를 하나의 락으로 보호하는 「거친 단위(coarse-grained) 락」과, 부분별로 다른 락으로 보호하는 「세밀한 단위(fine-grained) 락」을 비교한 설명으로 올바른 것은?
  5. 락프리(lock-free) 알고리즘의 성질로 올바른 것은?

이 분야의 비교