0

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

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

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

++m_ref;

--m_ref;

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

不知何故,我需要进入“幕后”并做些什么atomic<T>,但没有创建原子类型的开销:我担心附加 m_refatomic<T>会降低性能。

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

4

2 回答 2

6

您不能在 C++11 中对非原子类型使用原子操作。您必须使用std::atomic<int>orstd::atomic_int来获得对整数的原子操作。强制int转换std::atomic<int>为未定义的行为。

如果你有一个 C11 编译器和一个 C++11 编译器,那么你可以atomic_int在这两种情况下使用(使用合适using的 C++ 声明)。如果编译器兼容,那么一切都会“正常工作”。

于 2013-07-30T09:10:57.983 回答
0

从 C++20 开始使用 atomic_ref,您可以这样做:

#include <atomic>

void add(int& a)
{
    std::atomic_ref(a).fetch_add(1);
}
于 2021-03-01T08:31:24.200 回答