Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Susunan Semula Dalaman dalam Operasi Baca-Ubah Suai-Tulis C Atomic Mempengaruhi Susunan Memori?
Rawatan Operasi Baca-Ubahsuai-Tulis (RMW) Atom dalam Susunan Memori
Sebagai tindak balas kepada soalan berkenaan sifat bacaan atom -modify-write (RMW), standard C mengklasifikasikannya sebagai operasi tunggal dengan semantik yang menggabungkan kedua-dua perolehan dan pelepasan hartanah.
Implikasi untuk Pesanan
Penetapan ini membayangkan bahawa tiada memori membaca atau menulis yang berlaku dalam urutan yang sama boleh disusun semula sebelum atau selepas operasi RMW. Walau bagaimanapun, ia tidak menghalang kemungkinan menyusun semula antara komponen baca dan tulis dalaman RMW.
Contoh Konkrit
Pertimbangkan contoh kod yang disediakan:
std::atomic<int> x, y; void thread_A() { x.exchange(1, std::memory_order_acq_rel); y.store(1, std::memory_order_relaxed); } void thread_B() { int yy = y.load(std::memory_order_acquire); int xx = x.load(std::memory_order_acquire); std::cout << xx << ", " << yy << std::endl; }
Dalam senario ini, Thread B memang boleh mengeluarkan 0, 1. Ini kerana beban dan simpan operasi yang dilakukan dalam operasi RMW Thread A boleh disusun semula secara dalaman, membenarkan Thread B memerhati keadaan selepas beban (0) tetapi sebelum stor (1).
Pelaksanaan ARM64
Pelaksanaan ARM64 bagi operasi RMW, seperti yang diterangkan oleh arahan ldaxr, stlxr dan str, sejajar dengan jangkaan standard. Arahan str boleh dilihat sebelum arahan stlxr, yang berpotensi membawa kepada pemerhatian 0, 1 oleh Thread B.
Implikasi Susunan Memori
Menggantikan memory_order_acq_rel dengan seq_cst akan tidak menjejaskan tingkah laku ini, kerana ia hanya memperkenalkan semantik tambahan berbanding dengan operasi seq_cst yang lain, yang tidak terdapat dalam contoh kod.
Kesimpulan
Operasi RMW atom dalam C ialah operasi tunggal dengan semantik keluaran perolehan. Walaupun mereka menghalang penyusunan semula operasi luaran sebelum dan selepas, potensi untuk menyusun semula antara komponen dalaman mereka membolehkan senario seperti dalam contoh kod, di mana Thread B boleh mengeluarkan 0, 1.
Atas ialah kandungan terperinci Bagaimanakah Susunan Semula Dalaman dalam Operasi Baca-Ubah Suai-Tulis C Atomic Mempengaruhi Susunan Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!