首页 > 后端开发 > C++ > C 11 中的 const 能保证线程安全吗?

C 11 中的 const 能保证线程安全吗?

DDD
发布: 2024-12-20 20:59:10
原创
861 人浏览过

Does `const` in C  11 Guarantee Thread Safety?

“const”是否意味着 C 11 中的线程安全?

简介

人们普遍认为,在 C 11 中使用“const”可以保证线程安全安全。然而,这个概念需要进一步澄清。

澄清声明

虽然“const”本身并不能保证线程安全,但它满足了标准库的期望,即对“const”对象的操作是线程的安全的。具体来说:

  • 标记为“const”的操作应完全由读取(无写入)或内部同步写入组成。
  • 标准库假定对自身内部“const”对象的任何操作是非竞争的(只要它的非常量参数处理并发)。
  • 如果一个类型对其的操作“const”对象违反了这一期望,在标准库中使用该类型可能会导致数据争用和未定义的行为。

Const 不等于 Java 的同步

与 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;
    }
};
登录后复制
  • “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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板