在vc++的一个原子操作中设置POD的值
Set a value to POD within 1 atomic operation in VC++
我正试图找到一种方法来设置POD (int, byte, long等)作为原子操作。注意std::atomic并不适合我,因为它不是POD。
我也看了VC的内在函数,但没有找到我想要的(猜测由于缺乏文档)。
有人知道怎么做吗?
编辑:我不知道std::atomic是POD,所以我的问题是错误的,我会在一个新的问题中问它。我不想删除或修改这个问题,因为答案真的很好,信息丰富。谢谢! !我的实际问题:在vc++
使用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之外,我不考虑这种可能性。
- 对OpenMP reduction子句中的变量执行原子操作
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?
- 对单个变量的原子操作
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 为什么互斥对象与原子操作不同,前者是操作系统级,后者是处理器级
- 原子变量的多重赋值是原子操作吗?
- 对标准类型使用原子操作
- 共享指针,C 版本的原子操作
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- 原子操作传播/可见性(原子负载与原子RMW负载)
- 为什么原子操作需要独家的缓存访问
- 在英特尔上自然对齐的POD类型的保证原子操作
- C++ 如何编写原子操作
- 原子操作示例'Concurrency in Action'的正确性
- 嵌套原子操作是否保证为原子操作
- 如何实现原子操作
- 如何使用原子操作fetch_or或test_and_set在指针中设置一点,而在C 11中不使用Amberare_
- 指针地址交换总是C++中的原子操作吗
- 在vc++的一个原子操作中设置POD的值