IT story

C ++ 11에서 로컬 정적 변수 초기화는 스레드로부터 안전합니까?

hot-time 2020. 5. 12. 08:03
반응형

C ++ 11에서 로컬 정적 변수 초기화는 스레드로부터 안전합니까? [복제]


이 질문에는 이미 답변이 있습니다.

나는 이것이 자주 묻는 질문이라는 것을 알고 있지만 변형이 너무 많아서 다시 말하고 싶습니다. 현재 상태를 반영하는 대답이 있기를 바랍니다. 같은 것

Logger& g_logger() {
    static Logger lg;
    return lg;
}

변수 lg의 생성자가 한 번만 실행되도록 보장됩니까?

이전 답변에서 C ++ 03에서는 그렇지 않습니다. C ++ 0x 초안에서는 이것이 적용됩니다. 그러나 나는 더 명확한 대답을 원합니다.

  1. C ++ 11 표준 (초안 아님)에서 스레드 안전 초기화 동작이 완료됩니까?
  2. 위의 예에 해당하는 경우 현재 인기있는 컴파일러의 최신 릴리스, 즉 gcc 4.7, vc 2011 및 clang 3.0에서 제대로 구현 되었습니까?

관련 섹션 6.7 :

이러한 변수는 제어가 선언을 처음 통과 할 때 초기화됩니다. 이러한 변수는 초기화가 완료되면 초기화 된 것으로 간주됩니다. [...] 변수가 초기화되는 동안 제어가 동시에 선언에 들어가면 동시 실행은 초기화가 완료 될 때까지 기다려야합니다.

그런 다음 각주가 있습니다.

구현시 이니셜 라이저 실행에 교착 상태가 발생하면 안됩니다.

네, 안전합니다.

(이것은 물론 참조를 통한 변수에 대한 후속 액세스에 대해서는 아무 것도 말하지 않습니다.)


--fno-threadsafe-statics도 언급 할 가치가 있습니다. gcc에서 :

로컬 정적의 스레드 안전 초기화를 위해 C ++ ABI에 지정된 루틴을 사용하기 위해 추가 코드를 생성하지 마십시오. 이 옵션을 사용하면 스레드로부터 안전하지 않아도되는 코드에서 코드 크기를 약간 줄일 수 있습니다.

또한 이전 스레드를 살펴보십시오 . GCC에서 함수 정적 변수는 스레드 안전합니까?

참고 URL : https://stackoverflow.com/questions/8102125/is-local-static-variable-initialization-thread-safe-in-c11

반응형