예 ++

2013-11-15 5 views
0

예를 다음 고려 : 발광합니다 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으로 변경할 수 있습니까?

+0

아니요. assert는 시작할 수 있습니다. 흥미롭게도 thread2의 'y'에 대한 저장소 순서가 'relaxed'로 변경된 경우에도 일어날 수있는 사슬을 끊지 않으므로 'assert'가 실행되지 않습니다 이벤트 (쓰레드 3는 여전히 'acquire'를 사용해야합니다.) – LWimsey

답변

2

x & y에 대한 초기 값을 지정하지 않았으므로 예제가 완료되지 않았습니다. 그러나 모든 스레드를 시작하는 스레드가 0으로 초기화되었다고 가정 해 봅시다.

그런 다음 스레드 2가 저장소에 y를 수행하면 스레드 1의 저장소에서 x로 읽어 와서 동기화해야합니다. 스레드 3의 y에서로드가 스레드 2의 저장소를 y로 읽는 경우에도 동기화해야합니다. 따라서 스레드 1의 x에 대한 저장소는 스레드 3의로드보다 먼저 발생해야하며 초기화 저장소 이후 x에서 발생해야합니다. 따라서 스레드 3의 x.load는 값 10을 가져야합니다. 소비가 발생하지 않은 경우 전이가 발생합니다.

가능한 값을 보려면이 예제에서 CDSChecker를 사용하는 것이 좋습니다.

+0

http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync의 전반적인 여름 절의 예제를 보면 두 번째 주장이 시작될 것이라고합니다. – MRB

+0

GCC 예제는 다른 메모리 순서를 선언하므로 관련이 없습니다. – briand