Nice programing

언제 원 자성을 사용해야합니까?

nicepro 2020. 10. 15. 21:42
반응형

언제 원 자성을 사용해야합니까? bool 대신?


본질적으로 원자 atomic<bool>이기 때문에 중복 되지 bool않습니까? 부분적으로 수정 된 bool 값을 가질 수 없다고 생각합니다. atomic<bool>대신 언제 사용해야 bool합니까?


std::atomic*-something 이 아닌 한 C ++의 어떤 유형도 "원자 적"이 아닙니다. 표준이 그렇게 말하고 있기 때문입니다.

실제로를 조작하기 위해 내보내는 실제 하드웨어 명령어 std::atomic<bool>는 일반에서와 같을 수도 있고 같지 않을 수도 bool있지만 원자 적이라는 것은 더 큰 영향을 미치는 더 큰 개념입니다 (예 : 컴파일러 재정렬에 대한 제한). 또한 일부 작업 (예 : 부정)은 원자 적 작업에 오버로드되어 하드웨어에서 비 원자 변수의 기본 비 원자 읽기-수정-쓰기 시퀀스와는 다른 명령을 생성합니다.


기억 장벽 에 대해 기억하십시오 . bool부분적으로 변경하는 것은 불가능할 수 있지만 다중 프로세서 시스템이이 변수를 여러 복사본에 포함하고 다른 스레드가 새 값으로 변경 한 후에도 한 스레드가 이전 값을 볼 수 있습니다. Atomic은 메모리 장벽을 도입하므로 불가능합니다.


C ++의 원자 유형은 세 가지 잠재적 인 문제를 다룹니다. 첫째, 작업에 둘 이상의 버스 작업이 필요한 경우 작업 스위치에 의해 읽기 또는 쓰기가 손상 될 수 있습니다 ( 구현 방법에 따라에서 발생할 수 있음bool ). 둘째, 읽기 또는 쓰기는 작업을 수행하는 프로세서와 관련된 캐시에만 영향을 미칠 수 있으며 다른 프로세서는 캐시에서 다른 값을 가질 수 있습니다. 셋째, 컴파일러는 결과에 영향을 미치지 않는 경우 작업 순서를 재정렬 할 수 있습니다 (제약 조건은 조금 더 복잡하지만 지금은 충분합니다).

사용중인 유형이 구현되는 방식에 대한 가정을하고 명시 적으로 캐시를 비우고 컴파일러 별 옵션을 사용하여 재정렬을 방지하여 (아니요, 이렇게 volatile하지 않음) 이러한 세 가지 문제를 각각 해결할 수 있습니다. 컴파일러 문서에 명시되어 있지 않는 한).

하지만 왜 그 모든 것을 겪습니까? atomic당신을 위해 그것을 처리하고 아마도 당신이 스스로 할 수있는 것보다 더 나은 일을 할 것입니다.


원자 작전은 단순히 찢겨진 가치 이상에 관한 것이므로 찢어 bool질 가능성이있는 환경을 알지 못하는 당신과 다른 포스터에 동의하지만 더 많은 것이 위태 롭습니다.

Herb Sutter는 온라인에서 볼 수있는 이것에 대해 좋은 이야기를했습니다. 경고하십시오. 이것은 길고 복잡한 이야기입니다. 허브 셔터, 원자 무기 . 이 문제는 순차 일관성이라는 환상을 가질 수 있기 때문에 데이터 경쟁을 피하는 것으로 귀결됩니다.


비교 및 교환 작업을 고려하십시오.

bool a = ...;
bool b = ...;

if (a)
    swap(a,b);

a를 읽은 후 true를 얻고 다른 스레드가 나타나서 false를 설정할 수 있습니다. 그런 다음 (a, b)를 스왑합니다. 따라서 스왑이 이루어 졌더라도 exit b 후에는 false가됩니다.

사용 std::atomic::compare_exchange하면 전체 if / swap 논리를 원자 적으로 수행 하여 다른 스레드가 if와 swap 사이에서 a를 false로 설정할 수 없습니다 (잠금없이). 이러한 상황에서 b보다 스왑이 이루어진 경우 종료시 거짓이어야합니다.

이것은 bool과 같은 두 가지 값 유형에 적용되는 원자 연산의 한 예일뿐입니다.


특정 유형의 원자 성은 기본 하드웨어에만 의존합니다. 각 프로세서 아키텍처는 특정 작업의 원자성에 대해 서로 다른 보증을 제공합니다. 예를 들면 :

Intel486 프로세서 (및 이후 최신 프로세서)는 다음 기본 메모리 작업이 항상 원자 적으로 수행되도록 보장합니다.

  • 바이트 읽기 또는 쓰기
  • 16 비트 경계에 정렬 된 단어 읽기 또는 쓰기
  • 32 비트 경계에 정렬 된 더블 워드 읽기 또는 쓰기

다른 아키텍처는 작업이 원자 성인 사양이 다릅니다.

C ++는 기본 하드웨어에서 사용자를 추상화하기 위해 노력하는 고급 프로그래밍 언어입니다. 이러한 이유로 표준은 단순히 그러한 낮은 수준의 가정에 의존하는 것을 허용 할 수 없습니다. 그렇지 않으면 응용 프로그램을 이식 할 수 없기 때문입니다. 따라서 C ++의 모든 기본 유형은 atomic기본적으로 C ++ 11 호환 표준 라이브러리에 의해 대응되는 유형과 함께 제공됩니다 .

참고 URL : https://stackoverflow.com/questions/16320838/when-do-i-really-need-to-use-atomicbool-instead-of-bool

반응형