如果我一次声明并定义一个原子指针 -
std::atomic<int*> iptr = new int(1);
std::atomic<T*> iptr = new T();
Run Code Online (Sandbox Code Playgroud)
据我所知,整个操作不是原子的.
new T()涉及分配内存,构造T对象,然后将其原子分配给iptr.T可以是简单的可构造的,在这种情况下,构造T不应该抛出但是一些用户定义的T MAY抛出.
如果在T构造或内存分配之间某些其他线程使用iptr怎么办?
这个操作真的是原子的吗?使其成为原子的一种方法是打破声明和定义,例如
T* temp = new T();
std::atomic<T*> iptr = temp;
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以原子地做同样的事情吗?我的理解有缺陷吗?
new T()涉及分配记忆,
是.
构造
T对象
是.
然后它将自动分配给iptr.
完全(几乎,它是这里使用的对象的地址).它用于在内存分配和构造完成后初始化原子.
T可能是简单的可构造的,在这种情况下,构造T不应该抛出但是一些用户定义的TMAY抛出.
如果确实如此,则不会达到原子的初始化.该new如果c'tor抛出表达不泄漏内存,它调用适当的deallcoation功能.因此,您的临时和直接使用新表达式具有完全相同的语义.