我有一个struct
,其中包含一个表示内部引用计数的整数(比如int m_ref
)。
为了保持C兼容性,我无法将类型更改为std::atomic<int>
:struct
可能只包含普通旧数据。
但是,我想调整我的代码以利用C ++ 11中的原子功能;即我需要完成:
++m_ref;
和
--m_ref;
作为原子操作。我目前正在使用汇编程序(Intel总线锁)来执行此操作,但该代码几乎不可移植,而且我很想在C ++提供标准构造时将其删除。
不知怎的,我需要进入'引擎盖'并执行atomic<T>
所做的事情,但没有创建原子类型的开销:我担心将m_ref附加到atomic<T>
会降低性能。
我怀疑这是非常标准的,我在这里缺少一些简单的东西。
答案 0 :(得分:7)
您不能在C ++ 11中对非原子类型使用原子操作。您必须使用std::atomic<int>
或std::atomic_int
对整数进行原子操作。将int
转换为std::atomic<int>
是未定义的行为。
如果您有C11编译器以及C ++ 11编译器,那么在这两种情况下都可以使用atomic_int
(对C ++使用合适的using
声明)。如果编译器兼容,那么一切都将“正常工作”。
答案 1 :(得分:0)
从 C++20 开始使用 atomic_ref,你可以这样做:
#include <atomic>
void add(int& a)
{
std::atomic_ref(a).fetch_add(1);
}