Dalam bidang multithreading, kelas std::atomic menyediakan cara untuk akses serentak kepada data yang dikongsi merentas rangkaian sambil memastikan integriti data. Fungsi ahli stornya membenarkan untuk menulis nilai kepada pembolehubah atom dengan semantik susunan memori yang ditentukan.
Dalam kes ketekalan jujukan (std::memory_order_seq_cst), seni bina x86 menggunakan arahan xchg untuk melaksanakan stor atom. Arahan ini melakukan pertukaran nilai serentak dan bukannya operasi stor yang mudah.
Walaupun nampaknya arahan stor yang mudah digabungkan dengan penghalang ingatan (cth., _ReadWriteBarrier() atau asm volatile("" ::: "memori");) akan mencukupi untuk konsistensi berjujukan, menggunakan xchg mempunyai beberapa kelebihan:
1. Penghalang Memori Penuh: xchg bertindak sebagai pagar ingatan lengkap pada x86 kerana awalan kunci tersiratnya. Ini memastikan bahawa semua operasi memori sebelum dan selepas xchg dipesan, dengan berkesan menghalang penyusunan semula memori.
2. Semantik Keluaran Tidak Mencukupi: Operasi kedai biasa pada x86 mempamerkan semantik keluaran, yang membenarkan penyusunan semula dengan operasi seterusnya, termasuk memperoleh beban. Konsistensi berurutan, sebaliknya, menuntut agar penyusunan semula sedemikian adalah dilarang.
Pilihan antara xchg dan mov mfence untuk stor atom mempunyai implikasi prestasi:
Selain daripada menggunakan xchg untuk kedai atom, pilihan lain untuk melaksanakan pagar benang atom (juga dengan pesanan memori seq_cst) termasuk:
Adalah penting untuk ambil perhatian bahawa:
Ringkasnya, std::penyimpanan atom dengan konsistensi berjujukan pada seni bina x86 gunakan xchg kerana kesan penghalang memori penuh dan keserasian dengan keperluan konsistensi berjujukan. Walaupun pelaksanaan alternatif wujud, xchg kekal sebagai penyelesaian yang diterima pakai secara meluas untuk kecekapan dan pematuhannya terhadap pengesyoran industri.
Atas ialah kandungan terperinci Mengapakah `std::atomic` Menggunakan `XCHG` untuk Kedai Konsisten Berturutan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!