std atomic 예제

문제를 더 잘 이해하려면 AtomicInt96 값을 원자적으로 증분하는 다음 함수를 고려하십시오: C++11에는 알려진 정수 데이터 유형에 원자 유형이 있습니다. 지금까지 당신은 원자적 일체형 데이터 유형에 대한 전체 내용을 읽을 수 있습니다 – 이 작업을 포함하여 – en.cppreference.com 페이지에. std::atomic은 모든 것을 허용합니다. 어제 AddInt32 (*int32, int32)와 같은 원자성 작업을 제공하는 Go의 동기화 / 원자 패키지에 대한 강연을보고있었습니다. 이러한 특수 원자성 CPU 명령을 사용 하 여 구현 됩니다. C (WG14 N1284)에 기능에 대한 지원을 추가하는 원래 제안은 기본 정수, 문자 및 주소 (포인터) 유형각각에 해당하는 고정 된 수의 고정 된 수의 일반 세트와 함께 추가를 요구했습니다. 이러한 유형의 개체에 대한 작업을 수행할 수 있습니다. 효율적인 구현에서 구조체는 해당 형식(직접 형식이라고 함)의 단일 멤버만 포함할 것으로 예상되었으며 하드웨어에 필요한 정렬 경계에 패딩될 수 있습니다. 에뮬레이트된 구현에서 구조체는 필요한 잠금을 제공하기 위해 뮤텍스를 저장할 수도 있습니다. 원자 유형의 사양은 C와 C++간의 완전한 상호 운용성을 허용하도록 신중하게 제작되었습니다. 이를 달성하려면 원자성 형식이 두 언어모두에서 동일한 정렬, 크기 및 표현을 가져야 합니다.

원자성 형식 std::atomic 얻기 위해 사용자 정의 형식에 심각한 제한이 많이 있습니다. 이러한 제한은 형식에 있지만 이러한 제한은 std::atomic 수행할 수 있는 사용 가능한 작업에 있습니다. atomicValue.compare_exchange_strong(예상, 원하는) 호출은 다음 전략에 순종합니다. 원자가치의 원자성 비교와 예상되는 반환값이 true인 경우, atomicValue의 값은 원하는 원자성 연수에서 설정됩니다. 비교가 false를 반환하면 예상되는 것이 atomicValue로 설정됩니다. 작업이 compare_exchange_strong이라고 하는 이유는 간단합니다. 방법 compare_exchange_weak이 있다. 이 약한 버전은 스퓨리어스로 실패할 수 있습니다.

즉, *atomicValue == 예상 보유수이지만 약한 변형은 false를 반환합니다. 그래서 당신은 루프에서 조건을 확인해야합니다 : 동안 (!atomicValue.compare_exchange_weak (예상, 원하는) ). 약한 형태에 대한 이유는 성능입니다. 일부 플랫폼에서는 약한 것이 강력한 변형보다 빠릅니다. 표준 라이브러리는 std::atomic 템플릿의 부분 전문화 를 기본 템플릿에 없는 추가 속성을 가진 다음 형식에 대 한: 다행히도,이 문제는 진짜, 한스 Boehm, 원자의 저자 중 하나 제안은 루프의 정확성에 영향을 미치지 않는다고 지적합니다. 최악의 경우 하나의 반복을 추가합니다. 이는 오류가 발생하면 atomic_compare_exchange_strong() 호출이 memcpy()에 대한 호출에 의해 얻은 예상대로 원자 변수의 비트자 복사본을 저장하기 때문입니다. 비트 단위로 복사는 서명되지 않은 char의 lvalue를 통해 개체에 액세스하여 얻어지므로 (즉 memcpy(가 바이트를 복사하도록 지정되는 방법) C 표준에 의해 원본과 동일한 비트 표현을 갖도록 보장됩니다.

C++11 동시성 라이브러리는 원자성 유형을 템플릿 클래스로 소개합니다: std::atomic. 해당 템플릿과 함께 원하는 모든 Type을 사용할 수 있으며 해당 변수의 작업은 원자성이므로 스레드가 안전합니다. 해당 형식의 원자성을 만드는 데 사용되는 동기화 메커니즘을 선택하는 것은 라이브러리 구현에 달려 있다는 점을 고려해야 합니다. int, 긴, 부동, 같은 통합 유형에 대한 표준 플랫폼에서 …

Spread the love