두 스레드에서 액세스되는 변수 int foo
이 있습니다. 레이스 컨디션 문제가 없다고 가정하면 (액세스는 뮤텍스에 의해 보호되고, 모든 작업은 원자 적이며, 경쟁 조건으로부터 보호 할 다른 방법도있다.) 더 나은 이름이 없다는 이유로 "레지스터 캐싱"문제가 여전히있다. 여기서 컴파일러는 변수들 사이에 기록되지 않고 회 판독되면, 그 동일한 값이라고 가정 할 수 있으며, 다음처럼 얻어 것을 "최적화"수스레드간에 변수를 동기화하는 'volatile`
while(foo) { // <-may be optimized to if(foo) while(1)
do-something-that-doesn't-involve-foo;
}
또는
if(foo) // becomes something like (my assembly is very rusty): mov ebx, [foo]; cmp ebx, 0; jz label;
do-something-that-doesn't-involve-foo;
do-something-else-that-doesn't-involve-foo;
if(foo) // <-may be optimized to jz label2;
do-something;
foo
을 volatile
으로 표시합니까?이 문제가 해결 되었습니까? 한 스레드의 변경 사항이 다른 스레드에 도달 할 것을 보장합니까?
그렇지 않다면 어떻게해야합니까? Linux/Windows (아마도 별도의 솔루션), 아니 C++ 11에 대한 솔루션이 필요합니다.
표준에서 인용문을 볼 때마다 스레드에 대해 더 이상 volatile을 사용하지 않아도된다는 것을 기억합니다. C++에서는 – aaronman
http : // stackoverflow를 찾으려고합니다.com/questions/4557979/when-to-use-volatile-with-multi-threading –
여기에있는 문제는 "경쟁 조건 문제가 없다고 가정합니다"입니다. 그것은 ** ENORMOUS ** 가정입니다. –