假设我有以下课程:
class A
{
public:
...
...
void incrementN() {++n_;}
uint64_t getN() {return n_;}
private:
std::atomic<uint64_t> n_;
...
...
};
假设我初始化了类中的所有其他变量,除了n_
并且这不是线程本地存储,因此没有零初始化。
我创建了A类的对象,并继续调用incrementN()
。
如果在某些时候我想要n_
的值,并且我调用getN()
,这是否会导致原子load()
的{{1}}例程崩溃?
答案 0 :(得分:0)
默认情况下,加载使用memory_order_seq_cst。见这里:http://en.cppreference.com/w/cpp/atomic/memory_order。
正如评论中所提到的那样,它不应该给你任何正常注意力不能给予的问题。如果未初始化的初始值很大,您是否担心溢出?请参阅此处了解可能的后果:https://www.owasp.org/index.php/Integer_overflow
答案 1 :(得分:0)
n_成员变量刚刚未初始化。访问该字段将导致内存中的读取,并且没有理由崩溃,尽管该8字节内存的布局未知。
这个成员是原子的事实在这里并不重要。这将导致编译器不对此特定变量使用任何优化,并且还可能导致每次写入时将高速缓存行驱逐到RAM。