내가 설명에 따르면 앤서니 윌리엄스의 책 "C++ 동시성"이상한 결과에 대한 C++ 11 메모리 모델 (편안 순서)
#include<atomic>
#include<thread>
#include<cassert>
std::atomic_bool x,y;
std::atomic_int z;
void write_x_then_y() {
x.store(true, std::memory_order_relaxed);
y.store(true, std::memory_order_relaxed);
}
void read_y_then_x() {
while(!y.load(std::memory_order_relaxed));
if(x.load(std::memory_order_relaxed)) {
++z;
}
}
int main() {
x = false;
y = false;
z = 0;
std::thread a(write_x_then_y);
std::thread b(read_y_then_x);
a.join();
b.join();
assert(z.load()!=0);
}
의 메모리 모델의 예제를 테스트하고, 차이에 편안한 작업 변수 (여기 x 및 y)는 자유롭게 재정렬 할 수 있습니다. 그러나 나는 며칠 이상 문제를 반복적으로 실행했다. 나는 어설 션 (assert (z.load()! = 0);)이 발생한다는 상황에 결코 부딪치지 않았다. 난 그냥 기본 최적화를 사용하고 코드를 사용하여 컴파일 g + + -std = C++ 11 -lpthread dataRaceAtomic.cpp 아무도 실제로 그것을 시도하고 어설 션을 누르십니까? 누구든지 내 시험 결과에 대한 설명을 주실 수 있습니까? BTW, 나는 또한 원자형을 사용하지 않고 버전을 시도, 나는 같은 결과를 얻었다. 현재 두 프로그램 모두 정상적으로 실행 중입니다. 감사.
내가 올바르게 당신을 이해한다면, 당신은 다른 가게가 재정렬되지 않았다고 불평하고 있습니까? –
수 있습니다! = 될 것입니다. 특히 언어가 * 모델 *이기 때문에 모델의 구현이 "이러한 작업은 결코 재정렬되지 않을 것"과 같은 보증을 가질 수 있습니다. – GManNickG
아직 컴파일러가 메모리 모델을 지원하지 않습니다. – inf