繁体   English   中英

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

[英]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来获取对整数的原子操作。 intstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM