5

Supposed I have the following class:

class A
{
public:
...
...
void incrementN() {++n_;}
uint64_t getN() {return n_;}

private:
std::atomic<uint64_t> n_;
...
...

};

Assume that I initialize all the other variables in the class, except n_ and that this is not thread local storage, so there is no zero initialization.

I create an object of class A, and keep calling incrementN().

If at some point I want the value of n_, and I call getN(), can this cause the load() routine for the atomic n_ to crash?

4

2 回答 2

0

n_ 成员变量只是未初始化。对该字段的访问将导致读取内存并且没有理由崩溃,尽管这 8 字节内存的布局是未知的。

成员是原子的这一事实在这里并不重要。这将导致编译器不对这个特定变量使用任何优化,并且还可能导致每次写入时都将缓存行逐出到 RAM。

于 2014-12-02T09:49:31.167 回答
0

加载默认使用 memory_order_seq_cst。见这里:http ://en.cppreference.com/w/cpp/atomic/memory_order 。

正如评论中提到的,它不应该给你任何普通整数不会给出的问题。如果未初始化的初始值很大,您是否担心溢出?请参阅此处了解可能的后果:https ://www.owasp.org/index.php/Integer_overflow

于 2014-12-02T09:27:26.797 回答