Rumah >pembangunan bahagian belakang >C++ >Adakah `volatile` Masih Relevan dalam C 11 Multithreading?

Adakah `volatile` Masih Relevan dalam C 11 Multithreading?

Susan Sarandon
Susan Sarandonasal
2024-10-29 03:18:02849semak imbas

Is `volatile` Still Relevant in C  11 Multithreading?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn