Di Manakah std::atomic Menyembunyikan Kuncinya?
Dalam struktur data berbilang unsur, jenis atom standard mungkin tidak sentiasa dikunci- percuma. Ini disebabkan oleh ketidakupayaan CPU untuk memproses data tersebut tanpa bantuan kunci. Untuk menggambarkan, pertimbangkan contoh berikut:
#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; }
Outputnya untuk Linux/gcc mendedahkan perkara berikut:
0 16 16
Dengan mengandaikan jenis atom dan struktur foo menduduki jumlah ruang yang sama , nampaknya tidak mungkin kunci disimpan dalam atom. Tetapi apakah sebenarnya kebenaran di sebalik teka-teki ini?
Lokasi Kunci dan Implikasi untuk Berbilang Kejadian
Pendekatan lazim melibatkan penggunaan jadual cincang mutex (atau spinlock) yang dikunci ke alamat objek atom. Fungsi cincang ini mengutamakan bit terendah alamat sebagai indeks ke dalam tatasusunan saiz 2^n.
Selain itu, pelaksanaan LLVM std::atomic menggabungkan bit alamat yang lebih tinggi untuk mengelakkan pengalianan automatik. Ini memastikan objek yang dipisahkan oleh kuasa ketara 2 tidak dipetakan pada kunci yang sama.
Yang penting, objek atom hanya beroperasi dalam cara tanpa kunci apabila dikongsi dalam ingatan antara proses yang berbeza, di mana setiap proses dilengkapi dengan jadual kunci cincang sendiri.
Perlanggaran dalam jadual cincang mungkin memerlukan berhati-hati. Walaupun ini tidak menimbulkan isu ketepatan, ia boleh menjejaskan prestasi dengan memupuk perbalahan antara berbilang rangkaian. Walau bagaimanapun, ini adalah kejadian yang agak jarang berlaku, kerana objek atom bebas kunci biasanya digemari pada platform yang membimbangkan.
Mengenai kebuntuan, yakinlah bahawa ini bukan kebimbangan kerana std::fungsi atom mengelak daripada memperoleh kunci pada berbilang objek secara serentak. Akibatnya, kod perpustakaan yang bertanggungjawab untuk pemerolehan kunci tidak sekali-kali cuba untuk mendapatkan kunci tambahan sambil memegang yang sedia ada.
Atas ialah kandungan terperinci Adakah `std::atomic` Menggunakan Kunci Tersembunyi dan, Jika Ya, Di Mana Ia Terletak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!