在C ++中对普通整数使用原子操作

时间:2013-07-30 08:49:14

标签: c++ c++11 atomic

我有一个struct,其中包含一个表示内部引用计数的整数(比如int m_ref)。

为了保持C兼容性,我无法将类型更改为std::atomic<int>struct可能只包含普通旧数据。

但是,我想调整我的代码以利用C ++ 11中的原子功能;即我需要完成:

++m_ref;

--m_ref;

作为原子操作。我目前正在使用汇编程序(Intel总线锁)来执行此操作,但该代码几乎不可移植,而且我很想在C ++提供标准构造时将其删除。

不知怎的,我需要进入'引擎盖'并执行atomic<T>所做的事情,但没有创建原子类型的开销:我担心将m_ref附加到atomic<T>会降低性能。

我怀疑这是非常标准的,我在这里缺少一些简单的东西。

2 个答案:

答案 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);
}