当我在C++中调用 struce 的只读静态成员时,线程是否安全

Is thread safe when I call readonly static members of struce in C++

本文关键字:静态成员 线程 安全 是否 只读 C++ struce 调用      更新时间:2023-10-16

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

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

上面的代码可以通过编译并在这里运行良好(似乎是单线程(

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

我说的对吗?

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

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

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

查询的这些对象中的任何一个都可以安全地完成,除非它们的状态可以更改(这会破坏constexpr(。

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

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