pol*_*pts 22 c++ multithreading atomic c++11
我有一个类似下面的课程.
#include <atomic>
static const long myValue = 0;
class Sequence
{
public:
Sequence(long initial_value = myValue) : value_(initial_value) {}
private:
std::atomic<long> value_;
};
int main()
{
Sequence firstSequence;
Sequence secondSequence = firstSequence;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到这样的编译错误,
test.cpp:21:36: error: use of deleted function ‘Sequence::Sequence(const Sequence&)’
test.cpp:5:7: error: ‘Sequence::Sequence(const Sequence&)’ is implicitly deleted because the default definition would be ill-formed:
test.cpp:5:7: error: use of deleted function ‘std::atomic<long int>::atomic(const std::atomic<long int>&)’
Run Code Online (Sandbox Code Playgroud)
这是默认的复制构造函数,赋值opertaor在这种情况下不起作用吗?
PS:我使用的是gcc 4.6.3版
Ker*_* SB 22
您不能使用标准复制构造函数复制原子,因为所有加载和存储必须显式发生.你必须编写自己的复制构造Sequence
函数,为表格做一些初始化value_(rhs.value_.load())
(可能有更宽松的内存排序).
Atomic删除了copy-ctor.因此,您班级中的复制/移动控制器将被删除.
n3337 12.8/11
隐式声明的复制/移动构造函数是其类的内联公共成员.如果X具有以下内容,则将类X的默认复制/移动构造函数定义为已删除(8.4.3):
- 类型M(或其数组)的非静态数据成员,由于应用于M的相应构造函数的重载解析(13.3),无法复制/移动,导致模糊或被删除或无法访问的函数默认构造函数,
由于没有std::atomic<long int>::atomic(const std::atomic<long int>&)
函数,编译器无法为Sequence
该类创建默认的复制构造函数.如果您需要该类的复制构造函数(如果您想要Sequence secondSequence = firstSequence;
工作则需要),那么您需要编写一个.
标准需要此行为:
原子积分和地址类型如下所示.这些类型应具有标准布局.它们应该有一个简单的默认构造函数,一个constexpr显式值构造函数,一个删除的复制构造函数,一个删除的复制赋值运算符和一个普通的析构函数.这些类型应支持聚合初始化语法.
我猜想选择删除标准中的复制构造函数有两个原因:
通常需要加载/存储对。当您不控制 std::atomic 的调用者时,有什么方法可以强制执行此操作吗?
如果您使用的 std::atomic<> 类型是 is_lock_free() 为 false 的类型(即,在该大小的整数类型的实现中需要互斥体),您该怎么办?您使用什么复制语义来初始化互斥体?最终隐式复制的互斥锁需要重新初始化,因为它可能会在锁定状态下不幸被复制。我猜想 std::mutex 也有一个删除的复制构造函数,因此,这也将需求推入了 std::atomic 中。