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

Don*_*ott 5 c++ multithreading atomic c++11

我正在为数据结构编写一个复制构造函数,需要将两个std::atomic<T>成员复制到一个新对象中.虽然在我的用例中该过程不一定必须是原子的,但我希望能够找到最正确的解决方案.

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

原子(const atomic&)=删除;

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

SomeObject(const SomeObject& other): 
   _atomic1(other._atomic1.load()),            
   _atomic2(other._atomic2.load()) {
...
}
Run Code Online (Sandbox Code Playgroud)

我不相信这个操作是原子的,我也不知道如何制作(没有锁).

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

orl*_*rlp 4

唯一的方法是创建一个S包含两个Ts 的简单可复制结构并使用std::atomic<S>.

请注意,只有当您S从一开始就使用它时,这才有效 - 没有办法在没有锁的情况下原子地加载两个单独的原子。

所以而不是:

struct SomeObject {
    SomeObject(const SomeObject& other) : i(other.i.load()), j(other.j.load()) { }
    std::atomic<int> i, j;
};
Run Code Online (Sandbox Code Playgroud)

做这个:

struct SomeObject {
    SomeObject(const SomeObject& other) : data(other.data.load()) { }
    struct Data { int i, j; };
    std::atomic<Data> data;
};
Run Code Online (Sandbox Code Playgroud)

请注意,这可能(可能会)仍然在内部使用锁。用于is_lock_free检查是否有效。