人们普遍认为,在 C 11 中使用“const”可以保证线程安全安全。然而,这个概念需要进一步澄清。
虽然“const”本身并不能保证线程安全,但它满足了标准库的期望,即对“const”对象的操作是线程的安全的。具体来说:
与 Java 的“同步”不同, ''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中文网其他相关文章!