Keterbatasan Inheren Meruap dalam Pengaturcaraan Berbilang Thread
Dalam bidang pengaturcaraan berbilang thread, menyegerakkan akses kepada data dikongsi adalah penting. Satu pendekatan melibatkan penggunaan kata kunci yang tidak menentu untuk memastikan pemeliharaan nilai pembolehubah. Walau bagaimanapun, perbincangan baru-baru ini telah menimbulkan kebimbangan mengenai keberkesanan volatile dalam konteks sedemikian.
Apakah itu Volatile?
Volatile mengisytiharkan pembolehubah yang tidak sepatutnya dioptimumkan daripada program. Ini memastikan bahawa pengkompil tidak cache nilai dalam daftar tetapi mengambilnya daripada memori setiap kali ia diakses. Ia pada mulanya bertujuan untuk digunakan dengan daftar perkakasan atau operasi I/O tetapi sering digunakan dalam situasi pengaturcaraan berbilang thread.
Cabaran Meruap dalam Multithreading
Malangnya, tidak menentu mempunyai had apabila digunakan dalam konteks berbilang benang. Walaupun ia menjamin bahawa membaca dan menulis kepada pembolehubah yang tidak menentu berlaku serta-merta dan dalam susunan yang betul berbanding dengan akses yang tidak menentu yang lain, ia tidak menghalang penyusunan semula akses memori yang tidak menentu di sekeliling yang tidak menentu.
Pertimbangkan foo pembolehubah global diisytiharkan sebagai tidak menentu, dikongsi oleh berbilang rangkaian. Satu benang menetapkan foo secara atom, manakala satu lagi membacanya. Pengisytiharan yang tidak menentu memastikan bahawa operasi tulis dan baca tidak dioptimumkan. Walau bagaimanapun, pengkompil masih boleh menyusun semula operasi memori lain, seperti memuatkan pembolehubah tidak meruap, berbanding dengan operasi yang tidak menentu.
Penyelesaian: Halangan Memori dan Pembolehubah Atom
Untuk mengelakkan penyusunan semula, halangan memori diperlukan. Mereka mengarahkan pengkompil dan CPU untuk memastikan tiada akses memori disusun semula merentasi halangan. Meletakkan penghalang ingatan selepas menulis kepada pembolehubah yang tidak menentu menghalang penyusunan semula bacaan tidak meruap berikutnya berbanding dengan penulisan yang tidak menentu.
Walau bagaimanapun, memandangkan halangan memori juga menjamin bahawa semua bacaan dan penulisan yang belum selesai dilaksanakan, ia pada asasnya menyediakan fungsi yang sama seperti tidak menentu. Oleh itu, kata kunci yang tidak menentu menjadi tidak diperlukan apabila menggunakan halangan memori.
Alternatif Moden dalam C : Pembolehubah Atom
Dalam C 11, pembolehubah atom (std::atomic Atas ialah kandungan terperinci Adakah Volatile Benar-Benar Menyelesaikan Masalah Penyegerakan Multithreading?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!