Pembolehubah Meruap dalam C 11
Pengenalan model mesin berbilang benang dalam piawaian C 11 menimbulkan persoalan tentang tingkah laku meruap pembolehubah, yang secara tradisinya digunakan untuk menghalang pengoptimuman yang boleh mengakibatkan tingkah laku yang tidak ditentukan dalam persekitaran serentak.
Dalam C 98/03, kekurangan pengecaman multi-benang dalam model memori bermakna pengkompil boleh mengoptimumkan keluar pembacaan pembolehubah yang tidak menentu, yang membawa kepada contoh yang terkenal bagi gelung sementara yang tidak berkesudahan menunggu pembolehubah menukar nilainya.
Walau bagaimanapun, model memori C 11 mengakui kemungkinan akses serentak kepada pembolehubah. Adakah ini bermakna bahawa tidak menentu kini tidak digunakan lagi?
Pengoptimuman Pengkompil dan Tingkah Laku Tidak Ditakrifkan
Jawapannya terletak pada sifat bernuansa model memori C 11. Walaupun ia mengiktiraf pelbagai benang, ia tidak menghapuskan kemungkinan tingkah laku yang tidak ditentukan apabila mengakses pembolehubah tanpa penyegerakan yang betul. Walaupun dalam persekitaran berbilang benang, akses bukan atom kepada pembolehubah dikongsi kekal tidak ditentukan.
int x meruap;
void func() {
x = 0;
manakala (x = = 0) {}
}
Oleh itu, dalam kod contoh kami, pengkompil masih bebas untuk mengoptimumkan bacaan x dalam gelung sementara, mengakibatkan tingkah laku tidak ditentukan. Meruap hanya menjejaskan akses ingatan, bukan tingkah laku belitan.
Halangan Memori dan Integriti Benang
Integriti belitan memerlukan mekanisme penyegerakan yang betul untuk memastikan keterlihatan tulisan dalam satu utas ke utas yang lain . Model memori C 11 secara khusus mentakrifkan masa dan cara penulisan menjadi kelihatan kepada utas lain. volatile tidak memenuhi keperluan ini.
volatile menjamin bahawa pengkompil tidak boleh mengoptimumkan bacaan memori daripada pembolehubah, tetapi ia tidak memberikan sebarang jaminan tentang keterlihatan benang. Halangan memori, yang dikeluarkan oleh binaan penyegerakan seperti kunci atau operasi atom, adalah perlu untuk memastikan penulisan disegerakkan antara teras.
Kesimpulan
Dalam C 11, tidak menentu kekal relevan untuk menghalang pengoptimuman yang boleh membawa kepada akses memori yang salah. Walau bagaimanapun, ia tidak mencukupi untuk pengaturcaraan berbilang benang. Mekanisme penyegerakan yang betul masih diperlukan untuk menjamin integriti rangkaian dan tingkah laku yang ditentukan dalam persekitaran serentak.
Atas ialah kandungan terperinci Adakah `volatile` Masih Relevan dalam C 11 Multithreading?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!