Piawaian C 11 memperkenalkan perubahan ketara dalam model mesinnya, beralih daripada satu benang kepada berbilang pendekatan berulir. Ini menimbulkan persoalan: adakah perubahan ini menghapuskan potensi isu "pengoptimuman baca" yang terkenal, di mana pembolehubah statik dibaca dalam gelung sementara dioptimumkan?
Dalam persekitaran berbilang benang, adalah penting untuk mempertimbangkan potensi akses serentak kepada pembolehubah. Dalam C , kata kunci tidak menentu boleh digunakan untuk memaklumkan pengkompil bahawa pembolehubah tidak boleh dioptimumkan. Ini memastikan pembolehubah sentiasa dibaca daripada ingatan, walaupun apabila pengkompil sebaliknya menganggap nilainya kekal tidak berubah.
Dalam kes contoh klasik static int x; void func() { x = 0; manakala (x == 0) {} }, pengoptimum mungkin menganggap bahawa x kekal sifar sepanjang gelung dan menghapuskan gelung sepenuhnya. Walau bagaimanapun, jika utas lain mengubah suai x secara serentak, gelung tidak akan ditamatkan, membawa kepada tingkah laku yang tidak dapat diramalkan.
Sementara model memori C 11 memang mengenali kemungkinan akses serentak kepada pembolehubah, ia tidak mewajibkan operasi atom. Akses bukan atom kepada pembolehubah membentuk tingkah laku yang tidak ditentukan.
Ini bermakna walaupun dalam C 11, penggunaan tidak menentu tidak menangani masalah asas keselamatan benang. Model memori memerlukan mekanisme penyegerakan khusus, seperti mutex atau operasi atom, untuk mewujudkan susunan dan keterlihatan yang jelas antara benang.
Meruap berfungsi untuk tujuan yang berbeza. Ia menghalang pengkompil daripada mengoptimumkan bacaan memori, memastikan bahawa nilai yang paling terkini sentiasa diambil daripada memori. Walau bagaimanapun, ia tidak menangani isu memastikan integriti data merentas urutan.
Atas ialah kandungan terperinci Adakah Volatile Masih Relevan dalam Dunia Berbilang Benang C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!