在复制构造函数中复制原子的非锁定方法

时间:2015-11-15 18:11:59

标签: c++ multithreading c++11 atomic

我正在为数据结构编写一个复制构造函数,需要将两个std::atomic<T>成员复制到一个新对象中。虽然这个过程在我的用例中不一定必须是原子的,但我更愿意拥有最正确的解决方案。

我知道使用std::atomic<T>显式删除了复制构造函数,以强制用户使用原子接口。

  

atomic(const atomic&amp;)= delete;

我目前正在做的事情是这样的:

SomeObject(const SomeObject& other): 
   _atomic1(other._atomic1.load()),            
   _atomic2(other._atomic2.load()) {
...
}

我不相信这个操作是原子的,也不知道一种方法是这样的(没有锁)。

有没有办法以原子方式复制这些值(没有锁定)?

1 个答案:

答案 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检查是否存在。