[英]Using atomic operations on a normal integer in C++
我有一个包含表示内部引用计数的整数(比如int m_ref
)的struct
。
为了保持 C 兼容性,我不能将类型更改为std::atomic<int>
: struct
可能只包含普通的旧数据。
但是,我想调整我的代码以利用 C++11 中的原子特性; 即我需要完成:
++m_ref;
和
--m_ref;
作为原子操作。 我目前正在使用汇编程序(英特尔总线锁)来执行此操作,但该代码几乎不可移植,现在我很想删除它,因为 C++ 提供了标准构造。
不知何故,我需要进入“幕后”并做atomic<T>
所做的事情,但没有创建原子类型的开销:我担心将 m_ref 附加到atomic<T>
会降低性能。
我怀疑这是很标准的,我在这里遗漏了一些简单的东西。
您不能在 C++11 中对非原子类型使用原子操作。 您必须使用std::atomic<int>
或std::atomic_int
来获取对整数的原子操作。 将int
为std::atomic<int>
是未定义的行为。
如果你有一个 C11 编译器和一个 C++11 编译器,那么你可以在这两种情况下使用atomic_int
(对于 C++ 有一个合适的using
声明)。 如果编译器兼容,那么一切都会“正常工作”。
从 C++20 开始使用 atomic_ref,你可以这样做:
#include <atomic>
void add(int& a)
{
std::atomic_ref(a).fetch_add(1);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.