c 11 CAS로 ABA 카운터를 어떻게 구현할 수 있나요?
두 값을 동시에 원자적으로 업데이트하려면 원자적이고 인접한 구조체를 만듭니다. std::atomic
특히 x86의 경우 원자 객체에는 잠금이 없어야 합니다. CPU. gcc7 이상과 같은 컴파일러는 인라인 잠금 cmpxchg16b를 사용하는 대신 libatomic을 호출할 수 있습니다. 이러한 시나리오에서는 다음을 고려하십시오.
다음은 이러한 특성을 나타내는 C 11 코드의 예입니다.
#include <atomic> #include <stdint.h> using namespace std; struct node { struct alignas(2*sizeof(node*)) counted_ptr { node * ptr; uintptr_t count; // use pointer-sized integers to avoid padding }; // hack to allow reading just the pointer without lock-cmpxchg16b, // but still without any C++ data race struct counted_ptr_separate { atomic<node *> ptr; atomic<uintptr_t> count_separate; // var name emphasizes that accessing this way isn't atomic with ptr }; static_assert(sizeof(atomic<counted_ptr>) == sizeof(counted_ptr_separate), "atomic<counted_ptr> isn't the same size as the separate version; union type-punning will be bogus"); // TODO: write member functions to read next.ptr or read/write next_and_count union { // anonymous union: the members are directly part of struct node alignas(2*sizeof(node*)) atomic<counted_ptr> next_and_count; counted_ptr_separate next; }; };
요약하자면 두 값을 동시에 원자적으로 수정하려면 신중한 설계, 컴파일러 고려 사항 및 정렬 최적화가 필요합니다. . 이러한 지침을 따르면 효율적이고 올바른 코드를 사용하여 C 11에서 잠금 없는 ABA 카운터를 구현할 수 있습니다.
위 내용은 CAS를 사용하여 C 11에서 잠금 없는 ABA 카운터를 구현하고 성능 오버헤드를 최소화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!