Heim >Backend-Entwicklung >C++ >Wie kann ich mithilfe von CAS einen sperrfreien ABA-Zähler in C 11 implementieren und den Leistungsaufwand minimieren?
Wie kann ich einen ABA-Zähler mit c 11 CAS implementieren?
Um zwei Werte gleichzeitig atomar zu aktualisieren, erstellen Sie eine atomare, benachbarte Struktur. Angenommen, Sie verwenden std::atomic
Beachten Sie, dass das atomare Objekt sperrenfrei sein sollte, insbesondere für x86-CPUs. Compiler wie gcc7 und höher rufen möglicherweise libatomic auf, anstatt die Inline-Sperre cmpxchg16b zu verwenden. Berücksichtigen Sie in solchen Szenarien Folgendes:
Hier ist ein Beispiel für C 11-Code, der diese Eigenschaften aufweist:
#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; }; };
Zusammenfassend lässt sich sagen, dass die gleichzeitige atomare Änderung zweier Werte sorgfältige Design-, Compiler-Überlegungen und Ausrichtungsoptimierungen erfordert . Wenn Sie diese Richtlinien befolgen, können Sie sperrenfreie ABA-Zähler in C 11 mit effizientem und korrektem Code implementieren.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von CAS einen sperrfreien ABA-Zähler in C 11 implementieren und den Leistungsaufwand minimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!