人們普遍認為,在 C 11 中使用「const」可以保證線程安全安全。然而,這個概念需要進一步澄清。
雖然「const」本身並不能保證線程安全,但它滿足了標準庫的期望,即對「const」物件的操作是線程的安全的。具體來說:
與 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; } };
要正確利用「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中文網其他相關文章!