2012-09-09 3 views
17

상점은 릴리스 조작이고로드는 둘 다에 대한 조작을 확보합니다. memory_order_seq_cst은 모든 작업에 대해 추가적으로 전체 주문을 부과한다는 것을 알고 있지만, memory_order_seq_cst이 모두 memory_order_acq_rel으로 바뀌면이 경우가 아닌 예제를 작성하지 못합니다.memory_order_seq_cst와 memory_order_acq_rel은 어떻게 다릅니 까?

누락되었거나 그 차이는 문서 효과 일뿐입니다. 즉 편안한 모델로 게임하지 않으려는 경우 memory_order_seq_cst을 사용하고 편안한 모델을 구속 할 때 memory_order_acq_rel을 사용 하시겠습니까?

답변

18

http://en.cppreference.com/w/cpp/atomic/memory_order에는 memory_order_seq_cst과 함께 작동하는 하단의 좋은 예가 있습니다. 본질적으로 memory_order_acq_rel은 원자 변수를 기준으로 읽기 및 쓰기 순서를 제공하고 memory_order_seq_cst은 읽기 및 쓰기 순서를 전역 적으로 제공합니다. 즉, 순차적으로 일관된 작업이 모든 스레드에서 동일한 순서로 표시됩니다.

예는이 아래로 비등 : 당신이 z 항상 증가되는 것을 시행 획득 출시 의미를 사용할 수 있도록 z

bool x= false; 
bool y= false; 
int z= 0; 

a() { x= true; } 
b() { y= true; } 
c() { while (!x); if (y) z++; } 
d() { while (!y); if (x) z++; } 

// kick off a, b, c, d, join all threads 
assert(z!=0); 

작업은 두 원자 변수가 아니라 하나에 의해 보호된다.

+0

'x = true; y = true; c(); d()'가 불가능한 이유를 모르겠습니다. 그게 0이되어야합니다. 또한 왜 내가 결과로 2 많이 얻을지 모르겠다. –

+1

@ acidzombie24,이 경우에도'z'는 2가됩니다. – MSN

+0

나는 엉망이되어 코드를 읽습니다. 이제 완벽한 의미가됩니다. –

관련 문제