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#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.