Bagaimanakah saya boleh melaksanakan pembilang ABA dengan c 11 CAS?
Untuk mengemas kini dua nilai secara atom secara serentak, cipta struct atom bersebelahan. Katakan anda menggunakan std::atomic
Perhatikan bahawa objek atom harus bebas kunci, terutamanya untuk CPU x86. Penyusun seperti gcc7 dan kemudiannya mungkin memanggil libatomik dan bukannya menggunakan kunci sebaris cmpxchg16b. Dalam senario sedemikian, pertimbangkan perkara berikut:
Berikut ialah contoh kod C 11 yang menunjukkan ciri-ciri ini:
#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; }; };
Ringkasnya, mengubah suai dua nilai secara atom secara serentak memerlukan reka bentuk yang teliti, pertimbangan pengkompil dan pengoptimuman penjajaran . Dengan mengikuti garis panduan ini, anda boleh melaksanakan kaunter ABA tanpa kunci dalam C 11 dengan kod yang cekap dan betul.
Atas ialah kandungan terperinci Bagaimanakah saya boleh melaksanakan kaunter ABA tanpa kunci dalam C 11 menggunakan CAS dan meminimumkan overhed prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!