46. 함수 지역 정적 변수의 스레드 안전 지연 초기화("magic statics")
난이도 상 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C++
// 문제 46 — 함수 지역 정적 변수의 스레드 안전 지연 초기화("magic statics")
//
// 주제: 함수 안에 선언한 static 지역 변수는 언제·몇 번 초기화되는가? 네임스페이스
// 범위 정적과 초기화 시점이 어떻게 다른가? 여러 스레드가 동시에 처음 호출하면
// 초기화가 여러 번 일어나는가?
//
// 과제:
// 1) 아래 프로그램의 출력을 정확히 예측하라(초기화 로그의 순서와 각 값).
// 2) 함수 지역 static 이 "몇 번" 초기화되는지, 그 시점이 무엇에 의해 정해지는지,
// 그리고 C++11 이후 다중 스레드에서 어떻게 한 번만 초기화되는지 내부 동작으로 설명하라.
// 3) 네임스페이스 범위 정적(gEager)과 함수 지역 static(local)의 초기화 시점 차이를 설명하라.
#include <iostream>
int makeVal(const char* tag, int v) {
std::cout << "[init " << tag << "]\n";
return v;
}
// 네임스페이스 범위 정적(gEager)
int gEager = makeVal("gEager", 10);
int& counter() {
static int c = makeVal("counter", 100); // 함수 지역 static
return c;
}
int f() {
static int local = counter() + makeVal("local", 1); // 함수 지역 static
return local;
}
int main() {
std::cout << "start main\n";
std::cout << "f() = " << f() << "\n";
std::cout << "f() = " << f() << "\n";
std::cout << "counter() = " << counter() << "\n";
return 0;
} 내 리뷰 · C++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.