C++ 在C+;中调用struce的只读静态成员时线程安全吗+;
我有一个类,我想称它为enum: 以上代码可以通过编译并正常运行(似乎是单线程) 由于此结构是只读的,因此无法构造、复制、, 我想它是线程安全的C++ 在C+;中调用struce的只读静态成员时线程安全吗+;,c++,thread-safety,C++,Thread Safety,我有一个类,我想称它为enum: 以上代码可以通过编译并正常运行(似乎是单线程) 由于此结构是只读的,因此无法构造、复制、, 我想它是线程安全的 我说的对吗?类中的数据是以线程安全的方式构造的(magic_statics-C++11),并且是静态的,并且在代码执行期间不会更改它引用的任何数据 所以在这种情况下,答案是肯定的。但是如果数据是经过计算的,它可能开始有线程竞争,所以我不会把这个答案作为一般情况 函数main启动后,所有静态对象都已完全初始化。也就是说,它们处于初始状态 这些被查询的对象
我说的对吗?类中的数据是以线程安全的方式构造的(magic_statics-C++11),并且是静态的,并且在代码执行期间不会更改它引用的任何数据 所以在这种情况下,答案是肯定的。但是如果数据是经过计算的,它可能开始有线程竞争,所以我不会把这个答案作为一般情况 函数main启动后,所有静态对象都已完全初始化。也就是说,它们处于初始状态 这些被查询的对象中的任何一个都可以安全地完成,除非它们的状态可以改变(这会破坏
constexpr
)
当在多个线程中使用合适的锁访问对象时,或者在一段时间内,该对象没有以任何方式修改,可以在不从多个线程同步的情况下访问时,正确格式的C++
程序可以工作
因此,任何在一段时间内保持常量的对象(在您的例子中是在main
的生命周期内)都可以访问,而无需任何锁定。如果std::array中有任何数据的延迟计算,则可能会导致数据竞争,从而导致程序格式错误。类中的数据是以线程安全的方式构造的(magic_statics-C++11),并且是静态的,在代码执行期间,它引用的任何数据都不会更改
所以在这种情况下,答案是肯定的。但是如果数据是经过计算的,它可能开始有线程竞争,所以我不会把这个答案作为一般情况
函数main启动后,所有静态对象都已完全初始化。也就是说,它们处于初始状态
这些被查询的对象中的任何一个都可以安全地完成,除非它们的状态可以改变(这会破坏constexpr
)
当在多个线程中使用合适的锁访问对象时,或者在一段时间内,该对象没有以任何方式修改,可以在不从多个线程同步的情况下访问时,正确格式的C++
程序可以工作
因此,任何在一段时间内保持常量的对象(在您的例子中是在main
的生命周期内)都可以访问,而无需任何锁定。如果std::array中有任何数据的延迟计算,则可能会导致数据竞争,从而导致程序格式错误。是否计算的表示airthmetic,如+
?是否计算的表示airthmetic,如+
?
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);
}