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 중국어 웹사이트의 기타 관련 기사를 참조하세요!