Rumah >pembangunan bahagian belakang >C++ >Adakah `const` Menjamin Keselamatan Benang dalam C 11?
Adakah const Menyiratkan Keselamatan Benang dalam C 11?
Tanggapan bahawa const menunjukkan keselamatan benang dalam C 11 adalah sebahagiannya benar. Menurut Standard C, ungkapan yang mengubah suai atau mengakses lokasi memori yang sama sahaja dianggap bercanggah. Perlumbaan data timbul apabila terdapat dua tindakan bercanggah dalam urutan yang berbeza, di mana sekurang-kurangnya satu bukan atom dan tidak berlaku sebelum yang lain.
Pustaka Standard menjangkakan operasi pada objek const selamat untuk benang. Ini bermakna Pustaka Standard tidak akan memperkenalkan perlumbaan data selagi operasi pada objek const jenis yang ditentukan pengguna:
Melanggar jangkaan ini boleh mengakibatkan perlumbaan data untuk jenis yang secara langsung atau tidak langsung berinteraksi dengan komponen Perpustakaan Standard. Pada asasnya, const membayangkan keselamatan rangkaian dari perspektif Perpustakaan Standard, tetapi ia kekal sebagai kontrak yang tidak dikuatkuasakan oleh pengkompil.
Const vs. Java's Synchronized
Const in C 11 tidak bersamaan dengan disegerakkan di Jawa. Pertimbangkan kelas segi empat tepat yang dipermudahkan dengan kaedah set_size dan luas. kawasan selamat untuk benang bukan kerana const, sebaliknya kerana sifat baca sahaja. Walau bagaimanapun, set_size boleh menyebabkan perlumbaan data jika dipanggil serentak dengan kawasan.
Untuk memastikan keselamatan thread untuk kelas rect, const sahaja tidak mencukupi. Tulisan mesti disegerakkan secara dalaman, seperti dengan mutex, untuk mengelakkan perlumbaan data.
Implikasi untuk Keselamatan Benang
Pertimbangkan kelas tepat yang menyimpan cache kawasannya untuk mengelakkan kos yang tinggi pengiraan:
class rect { mutable int cached_area = 0; mutable bool cached_area_valid = true; // ... };
Kaedah kawasan tidak lagi selamat untuk benang kerana ia berfungsi menulis. Kemasukan contoh tepat dalam bekas standard membayangkan kontrak dengan Pustaka Standard, yang menjangkakan gelagat membaca. Untuk mengekalkan kontrak ini semasa melakukan penulisan, penyegerakan dalaman dengan mutex diperlukan:
class rect { mutable std::mutex cache_mutex; // ... };
Kesimpulan
Const menyampaikan keselamatan benang dalam erti kata yang terhad, tetapi ia berfungsi tidak menjaminnya. Untuk mencapai keselamatan benang sebenar, mekanisme penyegerakan tambahan mungkin diperlukan, terutamanya untuk jenis yang ditentukan pengguna yang berinteraksi dengan Pustaka Standard.
Atas ialah kandungan terperinci Adakah `const` Menjamin Keselamatan Benang dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!