本页内容

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)
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 指定要实现原子操作的整数类型。

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

  • 8 位:bool、char、signed char、unsigned char、qint8、quint8、char8_t(C++20)
  • 16 位:short、unsigned short、qint16、quint16、char16_t
  • 32 位:int、unsigned int、qint32、quint32、char32_t
  • 64 位:long long、unsigned long long、qint64、quint64
  • 平台特定大小:long、unsigned 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 提供了原子“测试并设置”、“读取并存储”以及“读取并加”函数的多种实现。 每种实现都定义了一种内存顺序语义,用于描述处理器如何执行原子指令周围的内存访问操作。由于许多现代架构允许乱序执行和内存顺序调整,因此必须使用正确的语义,以确保您的应用程序在所有处理器上都能正常运行。

  • 宽松(Relaxed)——内存顺序未指定,允许编译器和处理器自由重新排序内存访问。
  • 获取(Acquire)——原子操作之后的内存访问(按程序顺序)不得被重新排序至原子操作之前。
  • Release(释放)——原子操作之前(按程序顺序)的内存访问,不得被重新排序至原子操作之后。
  • 有序(Ordered)——结合了“获取”和“释放”两种语义。

测试并设置

如果 QAtomicInteger 的当前值与预期值一致,则“测试并设置”函数会将新值赋给 QAtomicInteger 并返回 true。如果值不一致,这些函数则不执行任何操作并返回 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表示整数的大小(以位为单位),OPERATION取值为REFERENCE_COUNTING 、TEST_AND_SET 、FETCH_AND_STORE 或FETCH_AND_ADD 之一,HOW取值为 ALWAYS、SOMETIMES 或 NOT 之一。 每种操作始终仅定义一个宏。例如,如果定义了 Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVE, 则既不会定义 Q_ATOMIC_INT_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE,也不会定义 Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_NOT_NATIVE。

在常数时间内完成的操作被称为无等待操作。此类操作不使用任何形式的锁或循环来实现。 对于始终受支持且无等待的原子操作,Qt 除了定义Q_ATOMIC_INTnn_OPERATION_IS_ALWAYS_NATIVE 之外,还定义了Q_ATOMIC_INTnn_OPERATION_IS_WAIT_FREE。

如果某个原子操作仅在新一代处理器上受支持,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_测试并设置操作始终是本机实现
  • Q_ATOMIC_INTnn_测试并设置有时是原生操作
  • Q_ATOMIC_INTnn_测试并设置非原生操作
  • Q_ATOMIC_INTnn_测试并设置_不需等待
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_始终是本机操作
  • Q_ATOMIC_INTnn_读取和存储有时是原生操作
  • Q_ATOMIC_INTnn_读取和写入操作非原生
  • Q_ATOMIC_INTnn_读取和写入不需等待
  • Q_ATOMIC_INTnn_读取和添加操作始终是原生操作
  • Q_ATOMIC_INTnn_读取_和_添加_有时_是_本机操作
  • Q_ATOMIC_INTnn_读取和加法操作非原生
  • 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 加到当前值上,并返回原始值。

该函数采用“释放-memory ordering ”语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。

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

T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)

原子读取并与运算。

读取该QAtomicInteger 的当前值,然后将valueToAnd 与当前值进行位与运算,并返回原始值。

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

另请参阅 operator&=()。

T QAtomicInteger::fetchAndAndOrdered(T valueToAnd)

原子读取并与运算。

读取该QAtomicInteger 的当前值,然后将valueToAnd 与当前值进行位与运算,并返回原始值。

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

另请参阅 operator&=()。

T QAtomicInteger::fetchAndAndRelaxed(T valueToAnd)

原子读取并按位与运算。

读取该QAtomicInteger 的当前值,然后将valueToAnd 与当前值进行位与运算,并返回原始值。

此函数采用宽松的 memory ordering 语义,允许编译器和处理器自由重新排序内存访问操作。

另请参阅 operator&=()。

T QAtomicInteger::fetchAndAndRelease(T valueToAnd)

原子读取并按位与运算。

读取该QAtomicInteger 的当前值,然后将valueToAnd 与当前值进行位与运算,并返回原始值。

该函数采用“释放” memory ordering 语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。

另请参阅 operator&=()。

T QAtomicInteger::fetchAndOrAcquire(T valueToOr)

原子读取并或运算。

读取该QAtomicInteger 的当前值,然后将valueToOr 与当前值进行按位或运算,并返回原始值。

该函数采用“获取-memory ordering ”语义,这确保了在原子操作之后(按程序顺序)的内存访问不会被重新排序至原子操作之前。

另请参阅 operator|=()。

T QAtomicInteger::fetchAndOrOrdered(T valueToOr)

原子读取并或运算。

读取该QAtomicInteger 的当前值,然后将valueToOr 与当前值进行按位或运算,并返回原始值。

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

另请参阅 operator|=()。

T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)

原子读取并或运算。

读取该QAtomicInteger 的当前值,然后将valueToOr 与当前值进行按位或运算,并返回原始值。

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

另请参阅 operator|=()。

T QAtomicInteger::fetchAndOrRelease(T valueToOr)

原子读取并或运算。

读取该QAtomicInteger 的当前值,然后将valueToOr 与当前值进行按位或运算,并返回原始值。

该函数采用“释放” 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 ,并返回原始值。

该函数采用“释放” 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 从当前值中减去,并返回原始值。

该函数采用“释放” memory ordering 语义,这确保了(按程序顺序)原子操作之前的内存访问在原子操作之后不会被重新排序。

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

T QAtomicInteger::fetchAndXorAcquire(T valueToXor)

原子获取并异或。

读取该QAtomicInteger 的当前值,然后将valueToXor 与当前值进行位异或运算,并返回原始值。

该函数采用“获取” memory ordering 语义,这确保了(按程序顺序)紧随原子操作之后的内存访问,不会被重新排序至该原子操作之前。

另请参阅 operator^=()。

T QAtomicInteger::fetchAndXorOrdered(T valueToXor)

原子取值并异或。

读取该QAtomicInteger 的当前值,然后将valueToXor 与当前值进行位异或运算,并返回原始值。

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

另请参阅 operator^=()。

T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)

原子获取并异或。

读取该QAtomicInteger 的当前值,然后将valueToXor 与当前值进行位异或运算,并返回原始值。

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

另请参阅 operator^=()。

T QAtomicInteger::fetchAndXorRelease(T valueToXor)

原子获取并异或。

读取该QAtomicInteger 的当前值,然后将valueToXor 与当前值进行位异或运算,并返回原始值。

该函数采用“释放” memory ordering 语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。

另请参阅 operator^=()。

[static constexpr] bool QAtomicInteger::isFetchAndAddNative()

如果 `fetch-and-add` 是通过原子处理器指令实现的,则返回 `true `;否则返回 `false`。

[static constexpr] bool QAtomicInteger::isFetchAndAddWaitFree()

如果原子“读取并添加”操作是无等待的,则返回true ;否则返回false。

[static constexpr] bool QAtomicInteger::isFetchAndStoreNative()

如果“fetch-and-store”操作是通过原子处理器指令实现的,则返回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

使用“Acquire”内存排序原子地加载此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 的值以原子方式存储到此原子类型中,并采用“Release”内存排序。

另请参阅 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 语义,这确保了在原子操作之后(按程序顺序)的内存访问不会被重新排序至原子操作之前。如果“测试并设置”操作失败,则currentValue 将采用“获取” 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 语义,这确保了原子操作前后(按程序顺序)的内存访问不得被重新排序。如果“测试并设置”操作失败,则currentValue 将采用acquire 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 语义,允许编译器和处理器自由重新排序内存访问。如果“测试并设置”操作失败,则会采用宽松的 memory ordering 语义将currentValue 加载进来。

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

原子测试与设置。

注意:若在 循环中使用此函数,建议改用带有附加参数 `T &currentValue ` 的重载版本,这样可避免在失败时执行多余的 `loadRelaxed()` 调用。

如果该QAtomicInteger 的当前值即为expectedValue ,则“测试并设置”函数会将newValue 赋值给该QAtomicInteger ,并返回true。如果两个值不相同,则该函数不执行任何操作,并返回false 。

该函数采用memory ordering 语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。

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

原子测试并设置。

如果该QAtomicInteger 的当前值是expectedValue ,则“测试并设置”函数将newValue 赋值给该QAtomicInteger ,并返回true 。如果两个值不相同,则该函数将该QAtomicInteger 的当前值加载到currentValue 中,并返回false 。

该函数采用“释放” memory ordering 语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。如果“测试并设置”操作失败,则currentValue 将采用“宽松” memory ordering 语义进行加载。

QAtomicInteger::operator T() const

如果可能,则使用顺序一致的内存排序原子地加载此QAtomicInteger 的值;否则使用“Acquire”排序。该值不会以任何方式被修改,但请注意,无法保证其值保持不变。

另请参阅 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)

原子异或并取值操作。

读取该QAtomicInteger 的当前值,然后将value 与当前值进行按位异或运算,并返回新值。

该函数在可能的情况下采用顺序一致的内存排序;否则采用“有序”排序。

另请参阅 fetchAndXorOrdered()。

T QAtomicInteger::operator|=(T value)

原子操作“或-且-读取”。

读取该QAtomicInteger 的当前值,然后将value 与当前值进行按位或运算,并返回新值。

该函数在可能的情况下使用顺序一致的内存排序;否则使用“有序”排序。

另请参阅 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)。

© 2026 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.