2016-10-29 6 views
4

가정하자 내가 두 스레드가 :C에서 원자 연산 ++ 재정렬

int value = 0; 
std::atomic<bool> ready = false; 

thread 1: 
value = 1 
ready = true; 

thread 2: 
while (!ready); 
std::cout << value; 

출력 0으로 할이 프로그램을?

저는 C++ 메모리 모델에 대해 읽었습니다. 구체적으로 말하면 순차적 일관성은 기본값이라고 생각합니다. 특히 명확하지는 않습니다. 컴파일러는 원자 연산을 서로 올바른 순서로 배치하기 위해서만 필요합니까? 아니면 모든 다른 연산과 관련하여 원자 연산을 올바른 순서로 배치해야합니까?

+1

다소 복잡합니다. * 스레드 내 * 및 * 스레드 간 * 고려해야 할 순서가 있습니다. 기본적으로 규칙은 "예상대로"작동하여 코드가 정확하고 자신이해야한다고 생각하는 것을 수행합니다. –

+2

순차적 인 일관성을 유지하려면 장애물과 비슷합니다. 그 위에있는 것들은 뒤를 위해 재배치 될 수 없으며, 아래에있는 것들은 그 앞에 가기 위해 재배치 될 수 없습니다. 다른 값이 원 자인지 아닌지는 중요하지 않습니다. 이 경우에는 괜찮습니다. – ShadowRanger

답변

2

기본적으로 원자 변수에 대한 작업은 memory_order_seq_cst 의미 체계를 사용하여 수행되므로 재정렬이 수행되지 않습니다.

는 따라서 라인 : value = 1는 원자 할당 아래에 다시 정렬 할 수 없습니다 value = 1, std::cout << value; 항상 같은 규칙 1.

를 인쇄 할 줄 때문에이 라인 : std::cout << value; 라인 위의
를 다시 정렬 할 수 없습니다 while (!ready);.

1

ShadowRanger의 응답에 따라 메모리 장벽처럼 작동합니다. 그러나 그 이유에 대한 자세한 내용은 Herb Sutter's talk on atomic weapons을 참조하십시오. 그는 atomics가 작동하는 방법과 이유에 대해 아주 자세히 설명합니다.