在vc++的一个原子操作中设置POD的值

Set a value to POD within 1 atomic operation in VC++

本文关键字:原子操作 设置 POD 的值 一个 vc++      更新时间:2023-10-16

我正试图找到一种方法来设置POD (int, byte, long等)作为原子操作。注意std::atomic并不适合我,因为它不是POD。

我也看了VC的内在函数,但没有找到我想要的(猜测由于缺乏文档)。

有人知道怎么做吗?

编辑:我不知道std::atomic是POD,所以我的问题是错误的,我会在一个新的问题中问它。我不想删除或修改这个问题,因为答案真的很好,信息丰富。谢谢! !我的实际问题:在vc++

中的一个原子操作中设置一个值为POD(没有'没有构造函数/析构函数)

使用std::atomic<T>,与您的问题所述相反,它是POD类型。让我们逐一检查POD要求:

9 Classes [class]

一个平凡可复制的类是这样一个类:
  • 没有非平凡的复制构造函数(12.8),
  • 没有非平凡移动构造函数(12.8),
  • 没有非平凡复制赋值操作符(13.5.3,12.8),
  • 没有非平凡的移动赋值操作符(13.5.3,12.8),和

std::atomic<T>没有重要的复制或移动构造函数或赋值操作符:它根本没有它们(它们被删除了)。它确实具有非平凡的非复制非移动构造函数和赋值操作符,但这并不妨碍类具有平凡的可复制性。

  • 有一个简单的析构函数(12.4)。

std::atomic<T>有一个简单的析构函数,见29.5。

一个平凡类是一个具有平凡默认构造函数(12.1)并且平凡可复制的类。

std::atomic<T>有一个简单的默认构造函数,参见29.5。

需求加起来:std::atomic<T>是一个平凡的类。

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

std::atomic<T>是一个非联合类,是一个普通类,是一个标准布局类,见29.5。

且没有非pod结构、非pod联合(或此类类型的数组)类型的非静态数据成员。

如果std::atomic<T>有任何非pod结构或联合类型的成员,这些成员中的一个必须是一个非平凡类或非标准布局类。这将防止std::atomic<T>成为一个平凡类或标准布局类*,并且由于我们已经确定它一个平凡类和标准布局类,因此它不能有这样的成员。

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

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

5原子积分专门化和专门化atomic<bool>应具有标准布局。它们都应该有一个简单的默认构造函数和一个简单的析构函数。它们都应该支持聚合初始化语法。

*有一个例外:假设一个平凡类可能包含一个非平凡类成员。对于std::atomic<T>来说,这需要实现者的恶意,所以在假设的死亡站9000之外,我不考虑这种可能性。