>백엔드 개발 >C++ >`std::atomic`은 숨겨진 잠금을 사용합니까? 그렇다면 어디에 위치합니까?

`std::atomic`은 숨겨진 잠금을 사용합니까? 그렇다면 어디에 위치합니까?

DDD
DDD원래의
2024-12-03 21:31:11828검색

Does `std::atomic` Use a Hidden Lock and, If So, Where Is It Located?

std::atomic은 어디에 잠금을 숨깁니까?

다중 요소 데이터 구조에서 표준 원자 유형은 항상 잠금이 아닐 수도 있습니다. 무료. 이는 잠금의 도움 없이는 CPU가 이러한 데이터를 처리할 수 없기 때문입니다. 설명을 위해 다음 예를 고려하십시오.

#include <iostream>
#include <atomic>

struct foo {
    double a;
    double b;
};

std::atomic<foo> var;

int main()
{
    std::cout << var.is_lock_free() << std::endl;
    std::cout << sizeof(foo) << std::endl;
    std::cout << sizeof(var) << std::endl;
}

Linux/gcc에 대한 출력은 다음을 나타냅니다.

0
16
16

원자 유형과 foo 구조가 동일한 양의 공간을 차지한다고 가정합니다. , 원자에 잠금이 저장될 가능성은 거의 없습니다. 하지만 이 수수께끼 뒤에 숨은 진실은 정확히 무엇입니까?

여러 인스턴스에 대한 잠금 위치 및 영향

관례적인 접근 방식에는 키가 지정된 뮤텍스(또는 스핀록)의 해시 테이블을 사용하는 것이 포함됩니다. 원자 객체의 주소로. 이 해시 함수는 주소의 가장 낮은 비트를 크기 2^n 배열의 인덱스로 선호합니다.

또는 LLVM std::atomic 구현은 자동 앨리어싱을 방지하기 위해 더 높은 주소 비트를 통합합니다. 이렇게 하면 상당한 2승으로 분리된 객체가 동일한 잠금에 매핑되지 않습니다.

중요한 점은 원자 객체는 각 프로세스가 장착된 개별 프로세스 간에 메모리에서 공유될 때 잠금 없는 방식으로만 작동합니다. 자체 잠금 해시 테이블이 있습니다.

해시 테이블 내 충돌은 주의가 필요할 수 있습니다. 이는 정확성 문제를 일으키지 않지만 여러 스레드 간에 경합을 조장하여 성능을 저하시킬 수 있습니다. 그러나 잠금이 없는 원자 개체는 일반적으로 관심 있는 플랫폼에서 선호되기 때문에 이는 비교적 드물게 발생합니다.

교착 상태와 관련하여 std::atomic 함수가 잠금 획득을 삼가하므로 이는 문제가 되지 않습니다. 여러 개체에 동시에. 결과적으로 잠금 획득을 담당하는 라이브러리 코드는 기존 잠금을 ​​유지하면서 추가 잠금을 확보하려고 시도하지 않습니다.

위 내용은 `std::atomic`은 숨겨진 잠금을 사용합니까? 그렇다면 어디에 위치합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.