Rumah >pembangunan bahagian belakang >C++ >Adakah `const` dalam C 11 Menjamin Keselamatan Benang?

Adakah `const` dalam C 11 Menjamin Keselamatan Benang?

DDD
DDDasal
2024-12-20 20:59:10862semak imbas

Does `const` in C  11 Guarantee Thread Safety?

Adakah 'const' Menyiratkan Keselamatan Benang dalam C 11?

Pengenalan

Adalah dipercayai secara meluas bahawa menggunakan 'const' dalam C 11 menjamin benang keselamatan. Walau bagaimanapun, tanggapan ini memerlukan penjelasan lanjut.

Menjelaskan Tuntutan

Walaupun 'const' sahaja tidak menjamin keselamatan benang, ia memenuhi jangkaan Perpustakaan Standard bahawa operasi pada objek 'const' adalah benang- selamat. Khususnya:

  • Operasi yang bertanda 'const' harus sepenuhnya terdiri daripada bacaan (tiada tulis) atau penyegerakan penulisan secara dalaman.
  • Perpustakaan Standard menganggap sebarang operasi pada objek 'const' dalam dirinya sendiri untuk bukan perlumbaan (selagi hujah bukan constnya mengendalikan konkurensi).
  • Jika sesuatu jenis operasi pada objek 'const'nya melanggar jangkaan ini, menggunakan jenis itu dengan Pustaka Standard boleh mengakibatkan perlumbaan data dan gelagat tidak ditentukan.

Const Tidak Sama dengan Java's Synchronized

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;
    }
};
  • Fungsi 'kawasan()' adalah selamat untuk benang kerana ia hanya membaca, bukan menulis.
  • Walau bagaimanapun, 'rect' itu sendiri tidak thread-safe kerana ia tidak menyegerakkan operasi tulis yang dilakukan oleh 'set_size()'.

Keselamatan Benang Bersyarat dengan 'const'

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()'.

Kekurangan Kata Kunci

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!

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