3. 메모리 모델과 가시성: volatile, Interlocked, memory_order, happens-before

난이도 상 해설 보기 →
문제

문제 3 — 메모리 모델과 가시성: volatile, Interlocked, memory_order, happens-before

면접 질문

  1. 멀티스레드에서 "가시성(visibility)" 문제란 무엇인가? 컴파일러/CPU의 어떤 동작이 이를 일으키는가?

  2. C#의 volatileInterlocked 는 각각 무엇을 보장하고 무엇을 보장하지 않는가? volatile만으로 count++가 안전해지지 않는 이유는?

  3. C++의 std::memory_orderrelaxed / acquire / release 의 차이를 설명하라. happens-before 관계가 이들과 어떻게 연결되는가?

응용 시나리오

다른 스레드가 만든 데이터를 "준비됐다" 플래그로 전달하는 흔한 패턴이다.

// 공유 변수
int   g_payload = 0;
std::atomic<bool> g_ready{false};

// 생산자 스레드
void producer() {
    g_payload = 42;                 // (1) 데이터 작성
    g_ready.store(true, /* ??? */); // (2) 준비 완료 표시
}

// 소비자 스레드
void consumer() {
    while (!g_ready.load(/* ??? */)) {}  // (3) 준비될 때까지 대기
    use(g_payload);                       // (4) 데이터 사용
}
  • ??? 자리에 memory_order_relaxed를 쓰면 어떤 버그가 가능한가? (4)에서 g_payload가 42가 아닐 수 있는 이유를 happens-before로 설명하라.
  • 이 패턴을 올바르게 동작시키려면 (2)와 (3)에 각각 어떤 memory_order를 써야 하는가? 그 조합이 (1)과 (4) 사이에 어떤 순서를 보장하는지 설명하라.
  • 같은 패턴을 C#으로 옮긴다면 g_readyg_payload를 어떻게 선언/접근하겠는가?
답안 작성
내 답안 · 자동 저장

직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.