【发布时间】:2018-05-14 09:57:55
【问题描述】:
如果我一次性声明并定义一个原子指针 -
std::atomic<int*> iptr = new int(1);
std::atomic<T*> iptr = new T();
据我了解,整个操作不是原子的。
new T() 涉及分配内存,构造 T 对象,然后将其原子分配给 iptr。 T 可能很容易构造,在这种情况下构造 T 不应该抛出,但某些用户定义的 T 可能会抛出。
如果在 T 构造或内存分配之间有其他线程使用 iptr 怎么办?
这个操作真的是原子的吗?使其原子化的一种方法是破坏声明和定义,例如
T* temp = new T();
std::atomic<T*> iptr = temp;
还有其他方法可以原子地做同样的事情吗? 我的理解有问题吗?
【问题讨论】:
-
请记住,虽然
T*可能是原子的;如果您有 2 个线程尝试同时分配它,您最终会出现内存泄漏。这是因为第一个将分配它 - 并成功;然后第二个将分配它,而不是从第一个释放内存。您可能想要交换而不是分配,以便如果它有一个值,您可以释放它(如果另一个线程正在使用它,这可能会导致崩溃)。