首頁 >後端開發 >C++ >C 11 中的 const 能保證線程安全嗎?

C 11 中的 const 能保證線程安全嗎?

DDD
DDD原創
2024-12-20 20:59:10920瀏覽

Does `const` in C  11 Guarantee Thread Safety?

「const」是否表示 C 11 中的執行緒安全?

簡介

人們普遍認為,在 C 11 中使用「const」可以保證線程安全安全。然而,這個概念需要進一步澄清。

澄清聲明

雖然「const」本身並不能保證線程安全,但它滿足了標準庫的期望,即對「const」物件的操作是線程的安全的。具體來說:

  • 標記為「const」的操作應完全由讀取(無寫入)或內部同步寫入組成。
  • 標準函式庫假定對自身內部「const」物件的任何操作是非競爭的(只要它的非常量參數處理並發)。
  • 如果一個類型對其的操作「const」物件違反了這一期望,在標準庫中使用該類型可能會導致資料爭用和未定義的行為。

Const 不等於 Java 的 Synchronized

與 Java 的「synchronized」不同, ''const'本身並沒有提供同步。考慮以下範例:

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;
    }
};
  • 「area()」函數是執行緒安全的,因為它只能讀取,不能寫入。
  • 但是,「rect」本身不是執行緒安全的執行緒安全,因為它不同步「set_size()」執行的寫入操作。

有條件「const」的執行緒安全

要正確利用「const」實作寫入的執行緒安全,可變狀態(如快取區域值)必須受到同步原語的保護,如下:

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;
    }
};

儘管「area()」是線程安全的,但由於不受保護的寫入,因此「rect」仍然是非線程安全的'set_size()'。

關鍵字短缺

C 開發人員耗盡關鍵字的說法是正確的,因為該語言自誕生以來保留字的數量有限。

以上是C 11 中的 const 能保證線程安全嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn