Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在VC+;中的1个原子操作内将值设置为POD+;_C++_Visual C++_Atomic - Fatal编程技术网

C++ 在VC+;中的1个原子操作内将值设置为POD+;

C++ 在VC+;中的1个原子操作内将值设置为POD+;,c++,visual-c++,atomic,C++,Visual C++,Atomic,我试图找到一种方法,将POD(int、byte、long等)设置为原子操作。 注意std::atomic对我不好,因为它不是POD 我还查看了VC intrensic函数,但没有找到我想要的(由于缺少文档,所以猜测) 有人知道怎么做吗 编辑:我不知道std::atomic是POD,因此我的问题是错误的,我将在新问题中重新提问。我不想删除或修改这个问题,因为答案确实是很好的信息。谢谢我的实际问题是:使用std::atomic,与您的问题所述相反,它是一种POD类型。让我们逐一了解POD要求: 9类

我试图找到一种方法,将POD(int、byte、long等)设置为原子操作。 注意std::atomic对我不好,因为它不是POD

我还查看了VC intrensic函数,但没有找到我想要的(由于缺少文档,所以猜测)

有人知道怎么做吗

编辑:我不知道std::atomic是POD,因此我的问题是错误的,我将在新问题中重新提问。我不想删除或修改这个问题,因为答案确实是很好的信息。谢谢我的实际问题是:

使用
std::atomic
,与您的问题所述相反,它是一种POD类型。让我们逐一了解POD要求:

9类[类]

6一般可复制类是指:

  • 没有非平凡的副本构造函数(12.8)
  • 没有非平凡的移动构造函数(12.8)
  • 没有非平凡的复制赋值运算符(13.5.3、12.8)
  • 没有非平凡的移动分配运算符(13.5.3、12.8),以及
std::atomic
没有非平凡的复制或移动构造函数或赋值运算符:它根本没有它们(它们被删除)。它确实有非平凡的非复制非移动构造函数和赋值运算符,但这并不妨碍该类具有平凡的可复制性

  • 有一个平凡的析构函数(12.4)
std::atomic
有一个简单的析构函数,请参见29.5

普通类是具有普通默认构造函数(12.1)且可复制的类

std::atomic
有一个微不足道的默认构造函数,请参见29.5

需求加起来:
std::atomic
是一个微不足道的类

10 POD结构是一个非联合类,它既是一个普通类,也是一个标准布局类

std::atomic
是一个非联合类,是一个普通类,是一个标准布局类,请参见29.5

并且没有类型为non-POD struct、non-POD union(或此类类型的数组)的非静态数据成员

如果
std::atomic
有任何类型为non-POD-struct或union的成员,则其中一个成员必须是非平凡类或非标准布局类。这将防止
std::atomic
成为普通类或标准布局类*,并且因为我们已经确定它是普通类和标准布局类,所以它不能有这样的成员

在上面,我提到了29.5。相关位为p5:

29.5原子类型[atomics.types.generic]

5原子整体专业化和专业化
原子
应具有标准布局。它们都应该有一个普通的默认构造函数和一个普通的析构函数。它们各自应支持聚合初始化语法


*有一个例外:假设一个平凡的类可能包含一个非平凡的类成员。要将此应用于
std::atomic
,它几乎需要实现者的恶意,因此在假设的死亡站9000之外,我不考虑这种可能性。

“设置一个POD”。。。“它不是豆荚”。。。这似乎相互矛盾。它是哪一个,一个豆荚还是不是?也许最清楚的做法是只显示代码和您希望发生的事情。似乎您正在寻找的是
std::atomic
std::is_pod::value
根据GCC和clang(libstdc++和libc++)是正确的。删除的副本构造函数并不能阻止它成为POD类型。我编辑了我的问题,以便更好地解释为什么std::atomic对我的情况没有帮助。我不太清楚,因为我不知道std::atomic是一个POD。非常感谢您对std::atomic的详细回答!我不知道它被认为是豆荚!但它仍然不能回答我的问题。为了更好地解释我的问题,我更新了我的问题。再次感谢@TCS不幸的是,现在已经研究过了,微软的
std::atomic
实现是不一致的,因为它没有一个微不足道的默认构造函数,尽管标准确实要求它有一个。“使用
std::atomic
”应该是正确的答案,我正试图想出一个解决方案,让您可以使用它。