원자성 작업에 동시성 클래스를 사용하면 동기화에 대해 걱정할 필요가 없다는 이점이 있습니다. 이렇게 하면 코드 가독성이 향상되고 오류가 감소합니다. 또한 원자성 작업 동시성 클래스는 리소스 잠금과 관련된 동기화보다 효율적인 것으로 가정합니다. 원자성 연산의 고전적인 사용은 스레드 안전 참조 계수용입니다. x가 int 형식의 참조 수이고 참조 수가 0이 되면 프로그램에서 일부 작업을 수행해야 한다고 가정합니다. 단일 스레드 코드에서는 일반 int를 x에 사용하고 --x를 쓸 수 있습니다. if(x==0) 동작()을 지정합니다. 그러나 이 메서드는 다음 표에 표시된 대로 두 스레드가 작업을 인터리브할 수 있으며 ta 및 tb는 컴퓨터 레지스터를 나타내고 시간이 아래쪽으로 진행되므로 다중 스레드 코드에 대해 실패할 수 있습니다. 스레드 간 동기화 또는 메모리 순서지정을 통해 원자성만 사용됩니다. std::Atomic 템플릿의 각 인스턴스화 및 전체 전문화는 원자유형을 정의합니다.
한 스레드가 원자성 객체에서 읽는 동안 한 스레드가 원자성 객체에 쓰는 경우, 비헤이비어는 잘 정의되어 있습니다(데이터 경주에 대한 자세한 내용은 메모리 모델 참조) 원자성 형식의 개체는 데이터 경합이 없는 유일한 개체입니다. 또는 하나에 의해 수정되고 다른 사람이 읽습니다. 단순히 난 당신이 원자에 대해 위에서 제안 한 프로그램을 수정할 수 있지만 두 경우 모두 동일한 결과를 얻고 있기 때문에 나는이 원자 변수의 어떤 이점을 본 적이 없다. 그래서 당신은 정확히 무엇인지 확인하기 위해 같은에 대한 또 다른 예를 제공 하시기 바랍니다 수 있습니다.. 원래 코드에서 얻는 오류는 완전히 정상입니다: std::atomic::Add 메서드(여기 참조)는 std::atomic 대한 전문화를 제공하지 않는 한 전혀 없습니다. 나는 "5,6,7,8"가는 카운트 값이 첫 번째 예에서 완벽하게 받아 들일 수 있다고 생각합니까? 다음은 AtomicInteger 메서드 incrementAndGet() 원자적으로 현재 값을 하나씩 증가하기 때문에 항상 카운트 값을 8로 출력하는 업데이트된 프로그램입니다. 다음과 같이 x 특성을 원자성으로 만들어야하며 전체 클래스가 아닙니다 : x를 위한 코드가 두 번 감소되지만 원래 값보다 하나만 줄어 끝납니다. 또한 x의 테스트가 감소와 별개이기 때문에 또 다른 문제가 발생합니다: x가 두 개로 시작하고 두 스레드가 if 조건을 평가하기 전에 두 스레드가 모두 감소x인 경우 두 스레드가 action()을 호출합니다. 이 문제를 해결하려면 한 번에 하나의 스레드만 감소작업을 수행하고 "if"가 확인한 값이 감소의 결과인지 확인해야 합니다. 뮤텍스를 도입하여 이 작업을 수행할 수 있지만 x를 원자성으로 선언하고 "if(-x==0) action()"을 작성하는 것이 훨씬 빠르고 간단합니다.
Published by: gianni57
Comments are closed.