我正在为数据结构编写一个复制构造函数,需要将两个std::atomic<T>
成员复制到一个新对象中。虽然这个过程在我的用例中不一定必须是原子的,但我更愿意拥有最正确的解决方案。
我知道使用std::atomic<T>
显式删除了复制构造函数,以强制用户使用原子接口。
atomic(const atomic&amp;)= delete;
我目前正在做的事情是这样的:
SomeObject(const SomeObject& other):
_atomic1(other._atomic1.load()),
_atomic2(other._atomic2.load()) {
...
}
我不相信这个操作是原子的,也不知道一种方法是这样的(没有锁)。
有没有办法以原子方式复制这些值(没有锁定)?
答案 0 :(得分:4)
唯一的方法是制作一个包含两个S
的简单可复制结构T
并使用std::atomic<S>
。
请注意,这仅在您从一开始就使用此S
时才有效 - 没有锁无法原子地加载两个独立的原子。
所以而不是:
struct SomeObject {
SomeObject(const SomeObject& other) : i(other.i.load()), j(other.j.load()) { }
std::atomic<int> i, j;
};
这样做:
struct SomeObject {
SomeObject(const SomeObject& other) : data(other.data.load()) { }
struct Data { int i, j; };
std::atomic<Data> data;
};
请注意,这可能(可能会)内部仍使用锁。使用http://codepen.io/anon/pen/KdJWYW检查是否存在。