Rumah >pembangunan bahagian belakang >C++ >Adakah `const` dalam C 11 Menjamin Keselamatan Benang?
Adalah dipercayai secara meluas bahawa menggunakan 'const' dalam C 11 menjamin benang keselamatan. Walau bagaimanapun, tanggapan ini memerlukan penjelasan lanjut.
Walaupun 'const' sahaja tidak menjamin keselamatan benang, ia memenuhi jangkaan Perpustakaan Standard bahawa operasi pada objek 'const' adalah benang- selamat. Khususnya:
Tidak seperti Java's 'disegerakkan,' 'const' tidak semestinya menyediakan penyegerakan. Pertimbangkan contoh berikut:
class rect { int width = 0, height = 0; public: void set_size(int new_width, int new_height) { width = new_width; height = new_height; } int area() const { return width * height; } };
Untuk menggunakan 'const' dengan betul untuk keselamatan benang dengan tulisan, keadaan boleh ubah (seperti nilai kawasan cache) mesti dilindungi oleh primitif penyegerakan, seperti yang ditunjukkan di bawah:
class rect { int width = 0, height = 0; mutable std::mutex cache_mutex; mutable int cached_area = 0; mutable bool cached_area_valid = true; public: void set_size(int new_width, int new_height) { if (new_width != width || new_height != height) { std::lock_guard< std::mutex > guard(cache_mutex); cached_area_valid = false; } width = new_width; height = new_height; } int area() const { std::lock_guard< std::mutex > guard(cache_mutex); if (!cached_area_valid) { cached_area = width * height; cached_area_valid = true; } return cached_area; } };
Walaupun 'kawasan()' sedang thread-size, 'rect' masih kekal tidak-thread-safe kerana penulisan tidak dilindungi dalam 'set_size()'.
Dakwaan bahawa pembangun C kehabisan kata kunci ialah benar, kerana bahasa itu mempunyai bilangan perkataan terpelihara yang terhad sejak penubuhannya.
Atas ialah kandungan terperinci Adakah `const` dalam C 11 Menjamin Keselamatan Benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!