예를 다음 고려 : 발광합니다 assert
초이 예에서예 ++
-Thread 1-
y.store (20, memory_order_relaxed);
x.store (10, memory_order_release);
-Thread 2-
if (x.load(memory_order_acquire) == 10) {
assert (y.load(memory_order_relaxed) == 20)
y.store (10, memory_order_release)
}
-Thread 3-
if (y.load(memory_order_acquire) == 10)
assert (x.load(memory_order_relaxed) == 10)
(내가 해결 해요?). y.store (10, memory_order_release)
전에 스레드 2에 x
에 상점이 없기 때문입니까?
(cppreference.com에서이 문장의 내용은 release
입니다. "이 메모리 순서로 저장 작업을 수행하면 다른 메모리 위치에 대한 이전 쓰기가 동일한 메모리 위치에서 소비 또는 획득하는 스레드에 표시됩니다 위치 "를 참조하십시오.)
release
에서 sec/cst
까지 스레드 2의 저장소 순서를 y
으로 변경할 수 있습니까?
아니요. assert는 시작할 수 있습니다. 흥미롭게도 thread2의 'y'에 대한 저장소 순서가 'relaxed'로 변경된 경우에도 일어날 수있는 사슬을 끊지 않으므로 'assert'가 실행되지 않습니다 이벤트 (쓰레드 3는 여전히 'acquire'를 사용해야합니다.) – LWimsey