c++ atomic 예제

원자성 연산을 나눌 수 없기 때문에 다른 스레드에서 동일한 개체에 대한 두 번째 원자성 연산을 첫 번째 원자성 작업 전후에만 개체의 상태를 얻을 수 있습니다. C++11 동시성 라이브러리는 원자성 유형을 템플릿 클래스로 소개합니다: std::atomic. 해당 템플릿과 함께 원하는 모든 Type을 사용할 수 있으며 해당 변수의 작업은 원자성이므로 스레드가 안전합니다. 해당 형식의 원자성을 만드는 데 사용되는 동기화 메커니즘을 선택하는 것은 라이브러리 구현에 달려 있다는 점을 고려해야 합니다. int, 긴, 부동, 같은 통합 유형에 대한 표준 플랫폼에서 … 그것은 몇 가지 잠금없는 기술이 될 것입니다. 큰 유형 (2MB 저장소를 보자)을 만들려면 std::atomic도 사용할 수 있지만 뮤텍스가 사용됩니다. 이 경우 성능 이점이 없습니다. 원자성 연산의 고전적인 사용은 스레드 안전 참조 계수용입니다. x가 int 형식의 참조 수이고 참조 수가 0이 되면 프로그램에서 일부 작업을 수행해야 한다고 가정합니다.

단일 스레드 코드에서는 일반 int를 x에 사용하고 —x를 쓸 수 있습니다. if(x==0) 동작()을 지정합니다. 그러나 이 메서드는 다음 표에 표시된 대로 두 스레드가 작업을 인터리브할 수 있으므로 ta 와 tb가 컴퓨터 레지스터를 나타내고 시간이 아래쪽으로 진행될 수 있기 때문에 다중 스레드 코드에 대해 실패할 수 있습니다. 다음 표원자 유형에 종속된 원자성 연산입니다. 이 클래스는 다중 스레드 환경에서 사용하기에 전혀 안전하지 않다는 것을 이미 알았습니다. 우리는 또한 뮤텍스를 사용하여 안전한지 확인하는 방법을 보았다. 이번에는 원자성 형식을 사용하여 안전하게 만드는 방법을 살펴보겠습니다. 이 기술의 주요 장점은 성능입니다. 실제로 대부분의 경우 std:::원자성 연산은 잠금보다 훨씬 빠른 잠금 없는 작업으로 구현됩니다. 이들 각각은 기본 적분 형식에 대한 위의 원자 중 하나의 별칭또는 확장 된 정수 형식을 가진 원자 클래스 템플릿의 전체 전문화입니다. 프로그램에서 원자성을 사용하려면 템플릿 인수 std::atomic을 특성에 사용합니다.

전체 클래스원자를 만들 수 없습니다.