gpt4 book ai didi

c++ - 当我在 C++ 中调用结构的只读静态成员时线程安全吗

转载 作者:行者123 更新时间:2023-12-02 10:32:14 25 4
gpt4 key购买 nike

我有一个类,我想把它称为枚举:

struct mac_constant {
private:
static constexpr int SL_MAX_val = 5;
static constexpr std::array<double,SL_MAX_val> r_SL{ 19.8, 40.16, 62.00, 83.84, 105.68 };
static constexpr std::array<size_t,SL_MAX_val> n_TS_SL{ 160, 192, 256, 320, 384 };

public:
static constexpr size_t SL_MAX = SL_MAX_val;
static constexpr double get_r_SL(const size_t SL_index) {
return r_SL.at(SL_index);
};
static constexpr size_t get_n_TS_SL(const size_t SL_index) {
return n_TS_SL.at(SL_index);
};

mac_constant() = delete;
mac_constant(const mac_constant&) = delete;
mac_constant& operator=(const mac_constant&) = delete;
};

我在主函数中调用它:
int main () {
int val = mac_constant::get_n_TS_SL(2);
}

以上代码可以通过编译运行正常 here (似乎是单线程)

因为这个结构是 只读 , 不能构造, 复制,
我猜它是线程安全的。

我对吗?

最佳答案

类中的数据是以线程安全的方式构造的(magic_statics - C++11),并且是静态的,它所引用的任何数据都不会在代码执行期间发生更改。

所以在这种情况下,答案是肯定的。但是如果数据是计算出来的,它可能会开始出现线程竞争,所以我不会把这个答案作为一般情况。

函数 main 启动后,所有的静态对象都已经完全初始化。也就是说,它们处于初始状态。

任何被查询的对象都可以安全地完成,除非它们的状态可以改变(这会破坏 constexpr 。)

格式正确的C++当使用合适的 locks 访问对象时程序工作。在多个线程中,或者在一段时间内,对象没有以任何方式被修改,它可以在多个线程不同步的情况下被访问。

因此,可以在没有任何锁定的情况下访问一段时间内为 const 的任何对象(在您的情况下为 main 的生命周期)。如果对 std::array 中的任何数据进行了延迟计算,那么这可能会导致数据争用,从而导致程序格式错误。

关于c++ - 当我在 C++ 中调用结构的只读静态成员时线程安全吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61837645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com