Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中调用struce的只读静态成员时线程安全吗+;_C++_Thread Safety - Fatal编程技术网

C++ 在C+;中调用struce的只读静态成员时线程安全吗+;

C++ 在C+;中调用struce的只读静态成员时线程安全吗+;,c++,thread-safety,C++,Thread Safety,我有一个类,我想称它为enum: 以上代码可以通过编译并正常运行(似乎是单线程) 由于此结构是只读的,因此无法构造、复制、, 我想它是线程安全的 我说的对吗?类中的数据是以线程安全的方式构造的(magic_statics-C++11),并且是静态的,并且在代码执行期间不会更改它引用的任何数据 所以在这种情况下,答案是肯定的。但是如果数据是经过计算的,它可能开始有线程竞争,所以我不会把这个答案作为一般情况 函数main启动后,所有静态对象都已完全初始化。也就是说,它们处于初始状态 这些被查询的对象

我有一个类,我想称它为enum:

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

由于此结构是只读的,因此无法构造、复制、, 我想它是线程安全的


我说的对吗?

类中的数据是以线程安全的方式构造的(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);
}