15. .NET 메모리 모델: volatile·Interlocked·가시성/원자성/순서

난이도 최상 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// ─────────────────────────────────────────────────────────────
// 주제: .NET 메모리 모델 — volatile, Interlocked, 그리고 가시성/원자성/순서
//
// 게임 서버에서 스레드 간에 플래그/데이터를 주고받고, 공유 카운터를 갱신한다.
// 아래 세 시나리오의 "가능한 결과"를 실행 전에 예측하라.
//
// 과제:
//   (1) Publish/Consume: 생산자가 _data=42 후 _ready=true 로 둔다. 소비자는
//       _ready 가 true 가 될 때까지 돌다가 _data 를 읽는다(둘 다 평범한 필드).
//       소비자가 출력하는 값은 항상 42 인가? 소비자가 멈추지 않을 가능성은?
//   (2) 두 스레드가 각각 _counter++ 를 1,000,000 번 한 뒤의 최종 _counter 는
//       항상 2,000,000 인가?
//   (3) (1)에 volatile, (2)에 Interlocked 를 적용하면 각각 무엇이 보장되고
//       무엇은 여전히 보장되지 않는가? volatile 로 (2)를 고칠 수 있는가?
//   (내부 동작 설명은 answer.md 에서. 여기서는 예측만.)
// ─────────────────────────────────────────────────────────────
using System.Threading;

class Shared
{
    public int _data;
    public bool _ready;
    public int _counter;

    // (1) 생산자
    public void Produce()
    {
        _data = 42;
        _ready = true;
    }

    // (1) 소비자
    public int Consume()
    {
        while (!_ready) { /* spin */ }
        return _data;
    }

    // (2) 비원자 증가
    public void BumpLoop()
    {
        for (int i = 0; i < 1_000_000; i++)
            _counter++;
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.