뮤텍스에 의해 보호되지 않는 변수 (아마도 휘발성)가 다중으로 액세스되는 (일반적으로 휘발성) 변수에 대해 다중으로 액세스되는 일반적으로 준수하는 표준 (ISO C 또는 C++ 또는 POSIX/SUS 사양) 에 할당되면 스레드는 결국 일관성있게됩니다.C/C++에서 휘발성 변수는 결국 스레드간에 일관된 의미를 갖도록 보장됩니까?
특정 예제를 제공하려면 변수 v를 공유하는 두 개의 스레드를 초기 값 0으로 간주하십시오.
스레드 1 : V = 1 개
스레드 2 동안 (V == 0) 수율();
스레드 2가 결국 종료된다는 보장이 있습니까? 또는 은 캐시 일관성이 결코 을 발동하지 않고 스레드 2의 캐시에 표시되도록하기 때문에 영원히 스핀 할 수 있습니까?
C 및 C++ 표준 (C++ 0x 이전)은 스레드 또는 동시성에 대해 에서 말하지 않습니다. 하지만 C++ 0x 메모리 모델이나 pthreads 또는 다른 어떤 것이라도 이것을 보장한다면 궁금합니다. (분명히 이것은 32 비트 x86에서 Windows에서 실제로 작동하지만, 일반적으로 의존 할 수있는 것이거나 그냥 거기에서 작동하는 경우 궁금합니다.)
캐시 일관성은 CPU에서 구현되며 ** 항상 ** 주력 아키텍처에서 실행됩니다. 그것은 소프트웨어가 가지고있는 것이 아닙니다. 캐시에 내용이 기록되면 메모리에 기록되고 다른 모든 스레드는이를 볼 수 있습니다. 그건 스레딩 문제가 아닙니다. 문제는 메모리 쓰기 *가 전혀 일어나지 않는지 여부입니다. 예상 시간에 발생하면 – jalf
인텔 아키텍처에서 작동합니다. 나는 그것이 작동하지 않을 것이라는 소문을 들었지만 나는 직접 본적이 없다. – Omnifarious
ARM은 (예를 들어) 일관된 캐시가없는 멀티 코어 아키텍처를 설계했습니다. 그 디자인이 실제로 얼마나 많이 사용되는지 잘 모릅니다. 장점은 모든 것을 유지하는 데 사용되는 실리콘과 열을 절약하는 것입니다. 물론 단점은 인텔 스레딩 모델에 익숙한 사람들의 혼란을 혼란스럽게합니다. –