QAtomicInteger Class

template <typename T> class QAtomicInteger

QAtomicInteger 类提供独立于平台的整数原子运算。更多

头文件: #include <QAtomicInteger>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承于

QAtomicInt

公共函数

QAtomicInteger(T value = 0)
QAtomicInteger(const QAtomicInteger<T> &other)
bool deref()
T fetchAndAddAcquire(T valueToAdd)
T fetchAndAddOrdered(T valueToAdd)
T fetchAndAddRelaxed(T valueToAdd)
T fetchAndAddRelease(T valueToAdd)
T fetchAndAndAcquire(T valueToAnd)
T fetchAndAndOrdered(T valueToAnd)
T fetchAndAndRelaxed(T valueToAnd)
T fetchAndAndRelease(T valueToAnd)
T fetchAndOrAcquire(T valueToOr)
T fetchAndOrOrdered(T valueToOr)
T fetchAndOrRelaxed(T valueToOr)
T fetchAndOrRelease(T valueToOr)
T fetchAndStoreAcquire(T newValue)
T fetchAndStoreOrdered(T newValue)
T fetchAndStoreRelaxed(T newValue)
T fetchAndStoreRelease(T newValue)
T fetchAndSubAcquire(T valueToSub)
T fetchAndSubOrdered(T valueToSub)
T fetchAndSubRelaxed(T valueToSub)
T fetchAndSubRelease(T valueToSub)
T fetchAndXorAcquire(T valueToXor)
T fetchAndXorOrdered(T valueToXor)
T fetchAndXorRelaxed(T valueToXor)
T fetchAndXorRelease(T valueToXor)
T loadAcquire() const
T loadRelaxed() const
bool ref()
void storeRelaxed(T newValue)
void storeRelease(T newValue)
bool testAndSetAcquire(T expectedValue, T newValue)
bool testAndSetAcquire(T expectedValue, T newValue, T &currentValue)
bool testAndSetOrdered(T expectedValue, T newValue)
bool testAndSetOrdered(T expectedValue, T newValue, T &currentValue)
bool testAndSetRelaxed(T expectedValue, T newValue)
bool testAndSetRelaxed(T expectedValue, T newValue, T &currentValue)
bool testAndSetRelease(T expectedValue, T newValue)
bool testAndSetRelease(T expectedValue, T newValue, T &currentValue)
T operator T() const
T operator&=(T value)
T operator++()
T operator++(int)
T operator+=(T value)
T operator--()
T operator--(int)
T operator-=(T value)
QAtomicInteger<T> &operator=(T)
QAtomicInteger<T> &operator=(const QAtomicInteger<T> &other)
T operator^=(T value)
T operator|=(T value)

静态公共成员

(since 6.7) void qYieldCpu()

详细说明

关于指针的原子操作,请参见QAtomicPointer 类。

原子操作是不间断完成的复杂操作。QAtomicInteger 类为整数提供了原子引用计数、测试-设置、获取-存储和获取-添加功能。

模板参数T 必须是 C++ 整数类型:

  • 8 位:bool、char、有符号 char、无符号 char、qint8、quint8、char8_t(C++20)
  • 16 位:short、无符号 short、qint16、quint16、char16_t
  • 32 位:int、无符号 int、qint32、quint32、char32_t
  • 64 位:long long、无符号 long long、qint64、quint64
  • 特定平台大小:long、无符号 long
  • 指针大小:qintptr、quintptr、qptrdiff

在上述列表中,只有 8 位、16 位、32 位和指针大小的实例能保证在所有平台上运行。对其他大小的支持取决于编译器和编译代码的处理器架构。要测试 32 位平台是否支持 64 位类型,请查看宏Q_ATOMIC_INT64_IS_SUPPORTED

原子 API

参考计数

ref() 和deref() 函数提供了高效的引用计数 API。这些函数的返回值用于指示最后一个引用何时被释放。通过这些函数,您可以实现自己的隐式共享类。

MySharedType &MySharedType::operator=(const MySharedType &other)
{
    (void) other.data->atomicInt.ref();
    if (!data->atomicInt.deref()) {
        // The last reference has been released
        delete d;
    }
    d = other.d;
    return *this;
}

内存排序

QAtomicInteger 提供了原子测试和设置、获取和存储以及获取和添加函数的多种实现。每种实现都定义了内存排序语义,用于描述处理器如何执行原子指令周围的内存访问。由于许多现代架构都允许无序执行和内存排序,因此使用正确的语义对于确保应用程序在所有处理器上正常运行是非常必要的。

  • 宽松--未指定内存排序,让编译器和处理器自由调整内存访问顺序。
  • 获取(Acquire)--原子操作之后的内存访问(按程序顺序)不得在原子操作之前重新排序。
  • 释放 - 原子操作之前的内存访问(按程序顺序)不得在原子操作之后重新排序。
  • 有序 - 结合相同的获取和释放语义。

测试和设置

如果 QAtomicInteger 的当前值是预期值,测试和设置函数会为 QAtomicInteger 分配一个新值并返回 true。如果值与not 相同,这些函数不会做任何操作,并返回 false。这一操作相当于以下代码:

if (currentValue == expectedValue) {
    currentValue = newValue;
    return true;
}
return false;

有 4 个测试和设置函数:testAndSetRelaxed(),testAndSetAcquire(),testAndSetRelease(), 和testAndSetOrdered().有关不同内存排序语义的解释,请参见上文。

取存

原子取存函数读取 QAtomicInteger 的当前值,然后分配一个新值,并返回原始值。这一操作相当于以下代码:

int originalValue = currentValue;
currentValue = newValue;
return originalValue;

共有 4 个取存函数:fetchAndStoreRelaxed ()、fetchAndStoreAcquire ()、fetchAndStoreRelease ()和fetchAndStoreOrdered ()。有关不同内存排序语义的解释,请参见上文。

取加

原子取加函数读取 QAtomicInteger 的当前值,然后将给定值添加到当前值,并返回原始值。该操作相当于以下代码:

int originalValue = currentValue;
currentValue += valueToAdd;
return originalValue;

共有 4 个取加函数:fetchAndAddRelaxed ()、fetchAndAddAcquire ()、fetchAndAddRelease ()和fetchAndAddOrdered ()。有关不同内存排序语义的解释,请参见上文。

原子 API 的功能测试

提供一个能在所有处理器上运行的独立于平台的原子 API 是一项挑战。QAtomicInteger 提供的 API 保证能在所有处理器上以原子方式运行。不过,由于并非所有处理器都支持 QAtomicInteger 提供的每种操作,因此有必要公开处理器的相关信息。

您可以在编译时使用各种宏来检查硬件支持哪些功能。这些宏将告诉您,您的硬件是始终支持、有时支持还是不支持特定操作。这些宏的形式为 Q_ATOMIC_INTnn_OPERATION_IS_HOW_NATIVE。nn是整数的大小(位),OPERATIONREFERENCE_COUNTINGTEST_AND_SETFETCH_AND_STOREFETCH_AND_ADD 中的一个,HOW是 ALWAYS、SOMETIMES 或 NOT 中的一个。每个操作总是有一个定义的宏。例如,如果定义了 Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVE,则既不会定义 Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE,也不会定义 Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_NOT_NATIVE。

在恒定时间内完成的操作称为免等待操作。此类操作不使用任何类型的锁或循环。对于始终支持且无需等待的原子操作,除了Q_ATOMIC_INTnn_OPERATION_IS_WAIT_FREE 之外,Qt 还定义了 Q_ATOMIC_INTnn_OPERATION_IS_ALWAYS_NATIVE。

如果只有新一代处理器支持原子操作,QAtomicInteger 还提供了一种方法,可以在运行时使用isReferenceCountingNative(),isTestAndSetNative(),isFetchAndStoreNative() 和isFetchAndAddNative() 函数检查硬件支持什么。使用isReferenceCountingWaitFree(),isTestAndSetWaitFree(),isFetchAndStoreWaitFree() 和isFetchAndAddWaitFree() 函数可以检测无等待实现。

下面是 QAtomicInteger 的所有功能宏的完整列表:

  • Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
  • Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_WAIT_FREE
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_SOMETIMES_NATIVE
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_WAIT_FREE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_WAIT_FREE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE

为了与以前版本的 Qt 兼容,空nn的宏等同于 32 位宏。例如,Q_ATOMIC_INT_REFERENCE_COUNTING_IS_WAIT_FREE 与 Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_WAIT_FREE 相同。

另请参阅 QAtomicPointer

成员函数文档

[constexpr noexcept] QAtomicInteger::QAtomicInteger(T value = 0)

用给定的value 构建一个 QAtomicInteger。

[noexcept] QAtomicInteger::QAtomicInteger(const QAtomicInteger<T> &other)

构造other 的副本。

bool QAtomicInteger::deref()

原子递减QAtomicInteger 的值。如果新值非零,则返回true ,否则返回 false。

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不会重新排序。

另请参见 ref() 和operator--()。

T QAtomicInteger::fetchAndAddAcquire(T valueToAdd)

原子取加。

读取QAtomicInteger 的当前值,然后将valueToAdd 添加到当前值,返回原始值。

该函数使用获取 memory ordering 语义,确保原子操作后的内存访问(按程序顺序)不会在原子操作前重新排序。

另请参阅 operator+=() 和fetchAndSubAcquire()。

T QAtomicInteger::fetchAndAddOrdered(T valueToAdd)

原子取加。

读取QAtomicInteger 的当前值,然后将valueToAdd 添加到当前值,返回原始值。

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不得重新排序。

另请参阅 operator+=() 和fetchAndSubOrdered()。

T QAtomicInteger::fetchAndAddRelaxed(T valueToAdd)

原子取加。

读取QAtomicInteger 的当前值,然后将valueToAdd 添加到当前值,返回原始值。

该函数使用宽松的 memory ordering 语义,允许编译器和处理器自由重新安排内存访问顺序。

另请参阅 operator+=() 和fetchAndSubRelaxed()。

T QAtomicInteger::fetchAndAddRelease(T valueToAdd)

原子取加。

读取QAtomicInteger 的当前值,然后将valueToAdd 添加到当前值,返回原始值。

该函数使用release memory ordering 语义,确保原子操作前的内存访问(按程序顺序)不会在原子操作后重新排序。

另请参阅 operator+=() 和fetchAndSubRelease()。

T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)

原子取加。

读取QAtomicInteger 的当前值,然后将valueToAnd 与当前值进行比特-并,返回原始值。

该函数使用获取 memory ordering 语义,确保原子操作后的内存访问(按程序顺序)不会在原子操作前重新排序。

另请参见 operator&=()。

T QAtomicInteger::fetchAndAndOrdered(T valueToAnd)

原子取加。

读取QAtomicInteger 的当前值,然后将valueToAnd 与当前值比特-AND,返回原始值。

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不得重新排序。

另请参见 operator&=()。

T QAtomicInteger::fetchAndAndRelaxed(T valueToAnd)

原子取加。

读取QAtomicInteger 的当前值,然后将valueToAnd 与当前值进行比特-并,返回原始值。

该函数使用宽松的 memory ordering 语义,允许编译器和处理器自由地重新安排内存访问顺序。

另请参见 operator&=()。

T QAtomicInteger::fetchAndAndRelease(T valueToAnd)

原子取加。

读取QAtomicInteger 的当前值,然后将valueToAnd 与当前值进行比特-并,返回原始值。

该函数使用release memory ordering 语义,确保原子操作前的内存访问(按程序顺序)不会在原子操作后重新排序。

另请参见 operator&=()。

T QAtomicInteger::fetchAndOrAcquire(T valueToOr)

原子取值-和-或。

读取QAtomicInteger 的当前值,然后将valueToOr 与当前值进行比特-OR,返回原始值。

该函数使用获取 memory ordering 语义,确保原子操作后的内存访问(按程序顺序)不得在原子操作前重新排序。

另请参见 operator|=()。

T QAtomicInteger::fetchAndOrOrdered(T valueToOr)

原子取值-和-或。

读取QAtomicInteger 的当前值,然后将valueToOr 与当前值进行比特-OR,返回原始值。

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不得重新排序。

另请参见 operator|=()。

T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)

原子取值-和-或。

读取QAtomicInteger 的当前值,然后将valueToOr 与当前值位相 OR,返回原始值。

该函数使用宽松的 memory ordering 语义,允许编译器和处理器自由地重新安排内存访问顺序。

另请参见 operator|=()。

T QAtomicInteger::fetchAndOrRelease(T valueToOr)

原子取值-和-或。

读取QAtomicInteger 的当前值,然后将valueToOr 与当前值进行比特-OR,返回原始值。

该函数使用release memory ordering 语义,确保原子操作前的内存访问(按程序顺序)在原子操作后不得重新排序。

另请参见 operator|=()。

T QAtomicInteger::fetchAndStoreAcquire(T newValue)

原子取存。

读取该QAtomicInteger 的当前值,然后将其赋值给newValue ,返回原始值。

该函数使用获取 memory ordering 语义,确保原子操作之后的内存访问(按程序顺序)不得在原子操作之前重新排序。

T QAtomicInteger::fetchAndStoreOrdered(T newValue)

原子取存。

读取该QAtomicInteger 的当前值,然后将其赋值给newValue ,返回原始值。

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不得重新排序。

T QAtomicInteger::fetchAndStoreRelaxed(T newValue)

原子取存。

读取QAtomicInteger 的当前值,然后将其赋值给newValue ,并返回原始值。

该函数使用宽松的 memory ordering 语义,让编译器和处理器自由地重新安排内存访问顺序。

T QAtomicInteger::fetchAndStoreRelease(T newValue)

原子取存。

读取该QAtomicInteger 的当前值,然后将其赋值给newValue ,返回原始值。

该函数使用release memory ordering 语义,确保原子操作前的内存访问(按程序顺序)在原子操作后不得重新排序。

T QAtomicInteger::fetchAndSubAcquire(T valueToSub)

原子取减。

读取QAtomicInteger 的当前值,然后减去valueToSub 的当前值,返回原始值。

该函数使用获取 memory ordering 语义,确保原子操作后的内存访问(按程序顺序)不得在原子操作前重新排序。

另请参阅 operator-=() 和fetchAndAddAcquire()。

T QAtomicInteger::fetchAndSubOrdered(T valueToSub)

原子取减。

读取QAtomicInteger 的当前值,然后减去valueToSub 的当前值,返回原始值。

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不得重新排序。

另请参见 operator-=() 和fetchAndAddOrdered()。

T QAtomicInteger::fetchAndSubRelaxed(T valueToSub)

原子取减。

读取QAtomicInteger 的当前值,然后减去valueToSub 的当前值,返回原始值。

该函数使用宽松的 memory ordering 语义,允许编译器和处理器自由重新安排内存访问顺序。

另请参阅 operator-=() 和fetchAndAddRelaxed()。

T QAtomicInteger::fetchAndSubRelease(T valueToSub)

原子取减。

读取QAtomicInteger 的当前值,然后减去valueToSub 的当前值,返回原始值。

该函数使用release memory ordering 语义,确保原子操作前的内存访问(按程序顺序)不会在原子操作后重新排序。

另请参阅 operator-=() 和fetchAndAddRelease()。

T QAtomicInteger::fetchAndXorAcquire(T valueToXor)

原子取值-XOR。

读取QAtomicInteger 的当前值,然后将valueToXor 与当前值进行比特-XOR,返回原始值。

该函数使用获取 memory ordering 语义,确保原子操作后的内存访问(按程序顺序)不得在原子操作前重新排序。

另请参见 operator^=()。

T QAtomicInteger::fetchAndXorOrdered(T valueToXor)

原子取值-XOR。

读取QAtomicInteger 的当前值,然后将valueToXor 与当前值进行比特-XOR,返回原始值。

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不得重新排序。

另请参见 operator^=()。

T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)

原子取值-XOR。

读取QAtomicInteger 的当前值,然后将valueToXor 与当前值进行比特-XOR,最后返回原始值。

该函数使用宽松的 memory ordering 语义,允许编译器和处理器自由地重新安排内存访问顺序。

另请参见 operator^=()。

T QAtomicInteger::fetchAndXorRelease(T valueToXor)

原子取值-XOR。

读取QAtomicInteger 的当前值,然后将valueToXor 与当前值进行比特-XOR,返回原始值。

该函数使用release memory ordering 语义,确保原子操作前的内存访问(按程序顺序)在原子操作后不得重新排序。

另请参见 operator^=()。

[static constexpr] bool QAtomicInteger::isFetchAndAddNative()

如果取加是使用原子处理器指令实现的,则返回true ,否则返回 false。

[static constexpr] bool QAtomicInteger::isFetchAndAddWaitFree()

如果原子取加是免等待的,则返回true ,否则返回 false。

[static constexpr] bool QAtomicInteger::isFetchAndStoreNative()

如果使用原子处理器指令实现取存,则返回true ,否则返回 false。

[static constexpr] bool QAtomicInteger::isFetchAndStoreWaitFree()

如果原子取存是免等待的,则返回true ,否则返回 false。

[static constexpr] bool QAtomicInteger::isReferenceCountingNative()

如果使用原子处理器指令实现了引用计数,则返回true ,否则返回 false。

[static constexpr] bool QAtomicInteger::isReferenceCountingWaitFree()

如果原子引用计数是免等待的,则返回true ,否则返回 false。

[static constexpr] bool QAtomicInteger::isTestAndSetNative()

如果测试和设置是使用原子处理器指令实现的,则返回true ,否则返回 false。

[static constexpr] bool QAtomicInteger::isTestAndSetWaitFree()

如果原子测试和设置是免等待的,则返回true ,否则返回 false。

T QAtomicInteger::loadAcquire() const

使用 "获取 "内存排序,原子加载QAtomicInteger 的值。该值不会以任何方式被修改,但请注意,并不能保证它始终如此。

另请参阅 storeRelaxed() 和loadRelaxed()。

T QAtomicInteger::loadRelaxed() const

使用宽松的内存排序,原子加载QAtomicInteger 的值。该值不会以任何方式被修改,但请注意,并不能保证它始终如此。

另请参阅 storeRelaxed() 和loadAcquire()。

bool QAtomicInteger::ref()

原子递增QAtomicInteger 的值。如果新值非零,则返回true ,否则返回 false。

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不会重新排序。

另请参见 deref() 和operator++()。

void QAtomicInteger::storeRelaxed(T newValue)

使用宽松的内存排序,将newValue 值原子存储到该原子类型中。

另请参见 storeRelease() 和loadRelaxed()。

void QAtomicInteger::storeRelease(T newValue)

使用 "释放 "内存排序,将newValue 值原子存储到该原子类型中。

另请参阅 storeRelaxed() 和loadAcquire()。

bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue)

原子测试和设置。

注意: 如果在循环中使用此函数,请考虑使用带有额外T &currentValue 参数的重载函数,这样可以避免在失败时使用额外的loadAcquire() 函数。

如果此QAtomicInteger 的当前值是expectedValue ,则测试和设置函数会将newValue 分配给此QAtomicInteger 并返回 true。如果值相同,则该函数不会执行任何操作,并返回false

该函数使用获取 memory ordering 语义,确保原子操作之后的内存访问(按程序顺序)不得在原子操作之前重新排序。

bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue, T &currentValue)

原子测试和设置。

如果QAtomicInteger 的当前值是expectedValue ,则测试和设置函数会将newValue 分配给QAtomicInteger ,并返回true 。如果值相同,函数会将QAtomicInteger 的当前值加载到currentValue ,并返回false

该函数使用获取 memory ordering 语义,确保原子操作之后的内存访问(按程序顺序)不得在原子操作之前重新排序。

bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue)

原子测试和设置。

注意: 如果在循环中使用此函数,请考虑使用带有额外T &currentValue 参数的重载函数,这样可以避免在失败时使用额外的loadAcquire() 函数。

如果此QAtomicInteger 的当前值是expectedValue ,则测试和设置函数会将newValue 分配给此QAtomicInteger 并返回 true。如果值相同,则该函数不做任何操作,并返回false

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不得重新排序。

bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue, T &currentValue)

原子测试和设置。

如果QAtomicInteger 的当前值是expectedValue ,则测试和设置函数会将newValue 分配给QAtomicInteger ,并返回true 。如果值相同,则会将此QAtomicInteger 的当前值加载到currentValue ,并返回false

该函数使用有序 memory ordering 语义,确保原子操作前后的内存访问(按程序顺序)不得重新排序。

bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue)

原子测试和设置。

注意: 如果在循环中使用此函数,请考虑使用带有额外T &currentValue 参数的重载函数,这样可以避免在失败时使用额外的loadRelaxed() 函数。

如果此QAtomicInteger 的当前值是expectedValue ,则测试和设置函数会将newValue 分配给此QAtomicInteger 并返回 true。如果值相同,则该函数不会做任何操作,并返回false

该函数使用宽松的 memory ordering 语义,让编译器和处理器自由地重新安排内存访问顺序。

bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue, T &currentValue)

原子测试和设置。

如果QAtomicInteger 的当前值是expectedValue ,则测试和设置函数会将newValue 分配给QAtomicInteger ,并返回true 。如果值相同,函数会将QAtomicInteger 的当前值加载到currentValue ,并返回false

该函数使用宽松的 memory ordering 语义,让编译器和处理器自由地重新安排内存访问顺序。

bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue)

原子测试和设置。

注意: 如果在循环中使用此函数,请考虑使用带有额外T &currentValue 参数的重载函数,这样可以避免在失败时使用额外的loadRelaxed() 函数。

如果此QAtomicInteger 的当前值是expectedValue ,则测试和设置函数会将newValue 分配给此QAtomicInteger 并返回 true。如果值相同,则该函数不会执行任何操作,并返回false

该函数使用release memory ordering 语义,确保原子操作前的内存访问(按程序顺序)在原子操作后不得重新排序。

bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue, T &currentValue)

原子测试和设置。

如果QAtomicInteger 的当前值是expectedValue ,则测试和设置函数会将newValue 分配给QAtomicInteger ,并返回true 。如果值相同,函数会将QAtomicInteger 的当前值加载到currentValue ,并返回false

该函数使用release memory ordering 语义,确保原子操作前的内存访问(按程序顺序)在原子操作后不得重新排序。

T QAtomicInteger::operator T() const

如果可能,使用顺序一致的内存排序方式原子加载QAtomicInteger 的值;如果不可能,则使用 "获取 "排序方式。该值不会以任何方式被修改,但要注意的是,并不能保证它始终如此。

另请参阅 loadRelaxed() 和loadAcquire()。

T QAtomicInteger::operator&=(T value)

原子加取。

读取QAtomicInteger 的当前值,然后将value 与当前值进行位相加,返回新值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参见 fetchAndAndOrdered()。

T QAtomicInteger::operator++()

原子预增QAtomicInteger 的值。返回该原子的新值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参阅 ref()、operator++(int) 和operator--()。

T QAtomicInteger::operator++(int)

QAtomicInteger 的值进行原子后递增。返回该原子的旧值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参阅 ref()、operator++() 和operator--(int)。

T QAtomicInteger::operator+=(T value)

原子添加和获取。

读取QAtomicInteger 的当前值,然后将value 与当前值相加,返回新值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参见 fetchAndAddOrdered() 和operator-=()。

T QAtomicInteger::operator--()

原子预减QAtomicInteger 的值。返回该原子的新值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参阅 deref()、operator--(int) 和operator++()。

T QAtomicInteger::operator--(int)

原子后递减QAtomicInteger 的值。返回该原子的旧值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参阅 deref()、operator--() 和operator++(int)。

T QAtomicInteger::operator-=(T value)

原子分取。

读取QAtomicInteger 的当前值,然后减去value 的当前值,返回新值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参见 fetchAndSubOrdered() 和operator+=()。

QAtomicInteger<T> &QAtomicInteger::operator=(T)

如果可能,使用顺序一致的内存排序将其他值原子存储到此原子类型中;如果不可能,则使用 "释放 "排序。此函数返回此对象的引用。

另请参见 storeRelaxed() 和storeRelease()。

[noexcept] QAtomicInteger<T> &QAtomicInteger::operator=(const QAtomicInteger<T> &other)

other 赋值给此QAtomicInteger ,并返回对QAtomicInteger 的引用。

T QAtomicInteger::operator^=(T value)

原子 xor 和取值。

读取QAtomicInteger 的当前值,然后将value 与当前值进行比特 XOR,返回新值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参见 fetchAndXorOrdered()。

T QAtomicInteger::operator|=(T value)

原子或和取。

读取QAtomicInteger 的当前值,然后将value 与当前值位相 OR,返回新值。

如果可能,该函数使用顺序一致的内存排序;如果不可能,则使用 "有序 "排序。

另请参见 fetchAndOrOrdered()。

相关非成员

[noexcept, since 6.7] void qYieldCpu()

使用硬件指令在未指定的时间内暂停当前线程的执行,但不会取消该线程的调度。该函数用于高吞吐量循环中,代码希望另一个线程修改一个原子变量。这与QThread::yieldCurrentThread() 完全不同,后者是操作系统级别的操作,可能会让整个线程离开 CPU,并允许其他线程(可能属于其他进程)运行。

因此

while (!condition)
    ;

应该写

while (!condition)
    qYieldCpu();

这对同一内核上的硬件多线程和非硬件多线程都有用。在使用硬件线程的情况下,它的作用是防止进一步的投机执行占用流水线,从而导致同级线程资源不足。在跨内核和更高级别的分离情况下,它允许高速缓存一致性协议将正在修改和检查的高速缓存行分配给逻辑处理器,而该处理器的代码正在期待其结果。

此外,还建议围绕不修改全局变量的代码进行循环,以避免在专门获取内存位置时发生争用。因此,应使用原子修改循环(如自旋锁获取):

while (true) {
    while (!readOnlyCondition(atomic))
        qYieldCpu();
    if (modify(atomic))
        break;
}

在 x86 处理器和带有Zihintpause 扩展的 RISC-V 处理器上,这将发出PAUSE 指令,在不支持该指令的处理器上,该指令将被忽略;在 ARMv7 或更高版本的 ARM 处理器上,这将发出YIELD 指令。

此函数在 Qt 6.7 中引入。

宏文档

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE

只有当处理器支持整数原子取加时,才定义该宏。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE

当硬件不支持整数原子取加时,定义此宏。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_SOMETIMES_NATIVE

只有某些处理器支持整数原子取加时,才会定义该宏。请使用QAtomicInteger::isFetchAndAddNative() 函数检查您的处理器支持哪些功能。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE

该宏与Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE 一起定义,用于表示整数的原子取加操作是免等待的。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE

只有当处理器支持整数原子取存时,才定义该宏。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_NOT_NATIVE

当硬件不支持整数的原子取存时,定义此宏。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_SOMETIMES_NATIVE

只有某些处理器支持整数原子取存时,才会定义该宏。请使用QAtomicInteger::isFetchAndStoreNative() 函数检查您的处理器支持哪些功能。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_WAIT_FREE

该宏与Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE 一起定义,用于表示对整数的原子取存操作是免等待的。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_IS_SUPPORTED

如果该编译器/体系结构组合支持大小为nn(位)的原子整数,则定义该宏。

nn是整数的大小,单位为位(8、16、32 或 64)。

总是定义以下宏:

  • q_atomic_int8_is_supported
  • q_atomic_int16_is_supported
  • q_atomic_int32_is_supported

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE

只有当所有处理器都支持原子引用计数时,才能定义该宏。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_NOT_NATIVE

该宏在硬件不支持原子引用计数时定义。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE

只有某些处理器支持原子引用计数时,才会定义该宏。请使用QAtomicInteger::isReferenceCountingNative() 函数检查您的处理器支持什么。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_WAIT_FREE

该宏与Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE 一起定义,表示引用计数是免等待的。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE

只有当处理器支持整数原子测试和设置时,才定义该宏。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_TEST_AND_SET_IS_NOT_NATIVE

当硬件不支持对整数进行原子测试和设置时,定义此宏。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_TEST_AND_SET_IS_SOMETIMES_NATIVE

当只有某些处理器支持整数原子测试和设置时,才会定义该宏。请使用QAtomicInteger::isTestAndSetNative() 函数检查您的处理器支持哪些功能。

nn是整数的大小,单位为位(8、16、32 或 64)。

Q_ATOMIC_INTnn_TEST_AND_SET_IS_WAIT_FREE

该宏与Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE 一起定义,用于表示对整数的原子测试和设置是免等待的。

nn是整数的大小,单位为位(8、16、32 或 64)。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.