c++ - 이란 - std::atomic 사용법




C++ 메모리 모델-이 예제에는 데이터 경합이 포함되어 있습니까? (4)

Bjarne Stroustrup의 C ++ 11 FAQ를 읽었으며 메모리 모델 섹션의 예를 이해하는 데 어려움을 겪고 있습니다.

그는 다음 코드 스 니펫을 제공합니다.

// start with x==0 and y==0
if (x) y = 1; // thread 1
if (y) x = 1; // thread 2

FAQ에는 여기에 데이터 경주가 없다고 나와 있습니다. 나는 이해하지 못한다. 메모리 위치 x 는 스레드 1에 의해 읽혀지고 동기화없이 쓰레드 2에 의해 쓰여진다 (그리고 y 는 동일하게된다). 그것은 두 가지 접근 방식 중 하나이며, 그 중 하나는 쓰기입니다. 이것이 데이터 경주의 정의가 아닌가?

또한 "현재 알고있는 모든 C ++ 컴파일러가 올바른 답변을 제공합니다." 이 한 가지 정답은 무엇입니까? 대답은 다른 스레드의 쓰기 전후에 한 스레드의 비교가 발생하는지 여부에 따라 다릅니다 (또는 다른 스레드의 쓰기가 읽기 스레드에 표시되는 경우에도)?


메모리 위치 x 은 쓰레드 2에 의해 쓰여진다.

진짜야? 왜 그렇게 말하니?

y 가 0이면 x 는 쓰레드 2에 의해 쓰여 지지 않는다 . 그리고 y 는 0으로 시작한다. 마찬가지로 y 는 쓰레드 1이 실행되기 전에 "0"이 아닌 한 0이 될 수 없다. 여기서 중요한 점은 실행하지 않는 조건부 쓰기가 데이터 경쟁을 유발하지 않는다는 것입니다.

이것은 if (x) y = 1; 코드를 변환하기 위해 스레딩을 인식하지 못하는 컴파일러가 허용되기 때문에 ( y 가 휘발성이 아닌 것으로 가정) 메모리 모델의 간단한 사실입니다 if (x) y = 1; ~ int tmp = y; y = 1; if (!x) y = tmp; int tmp = y; y = 1; if (!x) y = tmp; . 그러면 데이터 경주가있을 입니다. 정확한 변환을 원한다는 것이 왜 상상할 수는 없지만, 중요하지는 않습니다. 요점은 비 스레드 환경 용 옵티 마이저가 스레드 메모리 모델을 위반하는 일을 할 수 있다는 것입니다. 그래서 Stroustrup은 그가 알고있는 모든 컴파일러가 C ++ 11 스레딩 모델에 대한 올바른 대답을 제공한다고 말하면서 C ++ 11 스레딩을위한 컴파일러의 준비에 대한 간단한 설명입니다.

if (x) y = 1 의보다 현실적인 변환은 y = x ? 1 : y; y = x ? 1 : y; . 귀하의 예제에서 데이터 경주 발생하고 다른 스레드에서 y 를 읽는 것과 관련하여 순서가 지정되지 않은 상태로 실행하는 것이 안전하도록 지정하는 y = y 할당에 대한 특별한 처리 방법이 없다고 생각합니다. 하드웨어가 작동하지 않는 것을 상상하기 어려울 수도 있습니다. 어쨌든 제가 틀릴 수도 있습니다. 그래서 위의 다른 예제를 사용하는 것이 덜 현실적이지만 데이터가 뻔뻔 스럽습니다.


메모리 모델은 코드 및 데이터 영역의 지원 가능한 크기를 설정합니다. 링크 소스 코드를 비교하기 전에 데이터 및 코드의 크기 제한을 설정할 수있는 메모리 모델을 지정해야합니다.


쓰기의 총 순서가 있어야합니다. 왜냐하면 다른 스레드가 먼저 변수에 1 을 쓸 때까지 스레드가 변수 x 또는 y 쓸 수 없기 때문입니다. 즉, 기본적으로 세 가지 시나리오가 있습니다.

  1. 쓰레드 1은 if 가 쓰여질 이전 시점에서 x 가 쓰여졌 기 때문에 y 에 쓰게되고 쓰레드 2가 나중에 오면 x 에 같은 값인 1 쓰고 이전 값인 1 변경하지 않는다.
  2. 스레드 2는 if 문 앞의 어떤 지점에서 y 가 변경 되었기 때문에 x 에 쓰고, 나중에 동일한 값인 1 이면 y 는 쓰게됩니다.
  3. 스레드가 두 개인 if xy 가 0이므로 if 문이 건너 뜁니다.

// start with x==0 and y==0
if (x) y = 1; // thread 1
if (y) x = 1; // thread 2

x 나 y가 참이 아니기 때문에, 다른 것은 참이 될 수도 없습니다. 명령이 실행 된 순서에 관계없이 (올바른) 결과는 항상 x가 0이고 y가 0으로 유지됩니다.





memory-model