C++ (11)는 thread-safe initialization of static variables과 같은 기능을 제공, 우리는 예를 들어 말할 것 그 질문에 인용 :C++ 11로 컴파일/링크 된 타사 스레드 라이브러리에 C++ 11 스레드 안전성 보장이 적용됩니까?
Logger& g_logger() {
static Logger lg;
return lg;
}
그래서 표면적으로이 관계없이 사실이다
여부를 C++ 11 컴파일러로 컴파일 모듈 (?) 스레드 헤더를 포함하거나, 본문에 스레드를 생성합니다. C++ 11 스레드를 사용하는 다른 모듈과 링크되어 있고 함수가 호출 된 경우에도 보증을 제공합니다.
하지만이 코드를 호출하는 "다른 모듈"이 C++ 11 스레드를 사용하지 않았지만 Qt의 QThread
과 같은 것일 경우 어떻게해야합니까? C++ 11의 이러한 보증을 할 수없는 범위에서 원자를 초기화하는 것입니까? 아니면 C++ 11로 컴파일 된 다음 다른 C++ 11 코드와 링크 된 모듈의 단순한 사실은 관계없이 보증을 얻을 수 있음을 암시합니다.
누구나 이와 같은 문제가 다루어지는 좋은 참고 자료를 알고 있습니까?
정적 초기화는 언어 속성입니다. 어떻게 이것이 특정 라이브러리에 의해 영향을받을 수 있는지 나는 모르겠다. – pmr
@pmr 예를 들어 위의 정적 메모리는 프로그램 시작 부분에 할당되었지만 정적 인 내부 함수가 호출 될 때 생성자가 처음으로 실행되기 때문에 조금 까다로운 것처럼 보입니다. 이를 달성하기 위해 기본 스레드 모델에 대한 옴성을 요구하는 것 같습니다. QThread/C++ 11thread를 섞으면 올바른 결과를 얻을 수 있습니다. 새로운 바이너리 요구 사항이 적용될 수있는 약간의 기회가 있습니다. . – HostileFork
@HostileFork : (C++과 qt) 모두 스레딩을 위해 동일한 OS 기능을 사용하는 한, 어떻게 잘못 될지 알 수 없습니다. 또한 왜 둘 다 OS 스레딩 기능을 사용하지 않아야하는지 알지 못합니다. – PlasmaHH