当我在C++中调用 struce 的只读静态成员时,线程是否安全
Is thread safe when I call readonly static members of struce in C++
我有一个类,我想把它称为枚举:
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 中的任何数据都有延迟计算,那么这可能会导致数据争用,从而导致程序格式不正确。
相关文章:
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 非静态成员失败的线程调用函数
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 多线程处理中的静态成员变量
- 无效使用非静态成员函数 c++ 线程 linux
- 静态类数据成员的线程安全
- 为什么有一个额外的 & 将非静态成员函数的地址传递给 C++ 中的线程?
- 线程安全性和静态变量/成员功能
- 无法解析命名空间成员"线程"
- 线程中静态成员的缓存效率
- C++ 线程函数指针实现返回错误无效使用非静态成员函数
- C++多线程:是本地静态lambda线程安全的初始化
- 线程池 - 如何在成员线程完成后删除工作线程(此)
- 如何使类静态变量线程安全
- C 静态与线程存储持续时间破坏顺序
- 安全地移动在访问其他成员的成员线程中运行 lambda 的对象
- 对于 c++11 之前的编译器,返回本地静态对象线程是否安全
- 是块作用域静态或线程存储持续时间变量初始化失败的原因
- 指向对象初始化的静态指针——线程安全
- 本地静态的线程安全初始化:MSVC