QAtomicInteger 类
模板 <typename T> class QAtomicIntegerQAtomicInteger 类提供了对整数进行平台无关的原子操作的类。 更多...
头文件 | #include <QAtomicInteger> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
继承自 |
- 所有成员列表,包括继承的成员
- QAtomicInteger 是 线程类 的一部分。
公共函数
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 ¤tValue) |
bool | testAndSetOrdered(T expectedValue, T newValue) |
bool | testAndSetOrdered(T expectedValue, T newValue, T ¤tValue) |
bool | testAndSetRelaxed(T expectedValue, T newValue) |
bool | testAndSetRelaxed(T expectedValue, T newValue, T ¤tValue) |
bool | testAndSetRelease(T expectedValue, T newValue) |
bool | testAndSetRelease(T expectedValue, T newValue, T ¤tValue) |
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=(const QAtomicInteger<T> &other) |
QAtomicInteger<T> & | operator=(T) |
T | operator^=(T value) |
T | operator|=(T value) |
静态公共成员
bool | isFetchAndAddNative() |
bool | isFetchAndAddWaitFree() |
bool | isFetchAndStoreNative() |
bool | isFetchAndStoreWaitFree() |
bool | isReferenceCountingNative() |
bool | isReferenceCountingWaitFree() |
bool | isTestAndSetNative() |
bool | isTestAndSetWaitFree() |
相关非成员
(自 6.7) void | qYieldCpu() |
宏
详细说明
对于指针的原子操作,请参阅 QAtomicPointer 类。
原子操作是一个复杂操作,它能在没有中断的情况下完成。QAtomicInteger 类为整数提供了原子引用计数、测试和设置、获取和存储以及获取和增加操作。
模板参数 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位和指针大小的实例在所有平台上保证工作。对其他大小支持取决于代码编译的编译器和处理器架构。为了测试64位类型在32位平台上是否受支持,请检查宏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提供了原子测试和设置、获取和存储、获取和加的几个实现。每个实现都定义了一个内存排序语义,该语义描述了处理器如何执行围绕原子指令的内存访问。由于许多现代架构允许乱序执行和内存排序,因此使用正确的语义对于确保应用程序在所有处理器上正常工作至关重要。
- 松散 - 内存排序未指定,让编译器和处理器自由重排内存访问。
- 获取 - 在程序顺序中的原子操作之后的内存访问可能在原子操作之前不可重排。
- 释放 - 在程序顺序中的原子操作之前的内存访问可能在原子操作之后不可重排。
- 有序 - 结合了获取和释放语义。
测试和设置
如果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() 函数在运行时检查您硬件支持的 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。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
T QAtomicInteger::fetchAndAddAcquire(T valueToAdd)
原子获取加。
读取此QAtomicInteger的当前值,然后将valueToAdd添加到当前值,返回原始值。
此函数使用了获取内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不能在原子操作之前重排序。
另见 操作符+=() 和 fetchAndSubAcquire().
T QAtomicInteger::fetchAndAddOrdered(T valueToAdd)
原子获取加。
读取此QAtomicInteger的当前值,然后将valueToAdd添加到当前值,返回原始值。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
另见 操作符+=() 和 fetchAndSubOrdered().
T QAtomicInteger::fetchAndAddRelaxed(T valueToAdd)
原子获取加。
读取此QAtomicInteger的当前值,然后将valueToAdd添加到当前值,返回原始值。
此函数使用了宽松的内存顺序语义,允许编译器和处理器自由地重排序内存访问。
另见 操作符+=() 和 fetchAndSubRelaxed().
T QAtomicInteger::fetchAndAddRelease(T valueToAdd)
原子获取加。
读取此QAtomicInteger的当前值,然后将valueToAdd添加到当前值,返回原始值。
此函数使用了释放内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不会重排序。
另见 操作符+=() 和 fetchAndSubRelease().
T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)
原子获取与。
读取此QAtomicInteger的当前值,然后将valueToAnd与当前值进行位与操作,返回原始值。
此函数使用了获取内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不能在原子操作之前重排序。
另见 操作符&=().
T QAtomicInteger::fetchAndAndOrdered(T valueToAnd)
原子获取与。
读取此QAtomicInteger的当前值,然后将valueToAnd与当前值进行位与操作,返回原始值。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
另见 操作符&=().
T QAtomicInteger::fetchAndAndRelaxed(T valueToAnd)
原子获取与。
读取此QAtomicInteger的当前值,然后将valueToAnd与当前值进行位与操作,返回原始值。
此函数使用了宽松的内存顺序语义,允许编译器和处理器自由地重排序内存访问。
另见 操作符&=().
T QAtomicInteger::fetchAndAndRelease(T valueToAnd)
原子获取与。
读取此QAtomicInteger的当前值,然后将valueToAnd与当前值进行位与操作,返回原始值。
此函数使用了释放内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不会重排序。
另见 操作符&=().
T QAtomicInteger::fetchAndOrAcquire(T valueToOr)
原子获取或。
读取此QAtomicInteger的当前值,然后将valueToOr与当前值进行位或操作,返回原始值。
此函数使用了获取内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不能在原子操作之前重排序。
另见 操作符|=().
T QAtomicInteger::fetchAndOrOrdered(T valueToOr)
原子获取或。
读取此QAtomicInteger的当前值,然后将valueToOr与当前值进行位或操作,返回原始值。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
另见 操作符|=().
T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)
原子获取或。
读取此QAtomicInteger的当前值,然后将valueToOr与当前值进行位或操作,返回原始值。
此函数使用了宽松的内存顺序语义,允许编译器和处理器自由地重排序内存访问。
另见 操作符|=().
T QAtomicInteger::fetchAndOrRelease(T valueToOr)
原子获取或。
读取此QAtomicInteger的当前值,然后将valueToOr与当前值进行位或操作,返回原始值。
此函数使用了释放内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不会重排序。
另见 操作符|=().
T QAtomicInteger::fetchAndStoreAcquire(T newValue)
原子fetch-and-store。
读取此QAtomicInteger的当前值,然后将其分配给newValue,返回原始值。
此函数使用了获取内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不能在原子操作之前重排序。
T QAtomicInteger::fetchAndStoreOrdered(T newValue)
原子fetch-and-store。
读取此QAtomicInteger的当前值,然后将其分配给newValue,返回原始值。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
T QAtomicInteger::fetchAndStoreRelaxed(T newValue)
原子fetch-and-store。
读取此QAtomicInteger的当前值,然后将其分配给newValue,返回原始值。
此函数使用了宽松的内存顺序语义,允许编译器和处理器自由地重排序内存访问。
T QAtomicInteger::fetchAndStoreRelease(T newValue)
原子fetch-and-store。
读取此QAtomicInteger的当前值,然后将其分配给newValue,返回原始值。
此函数使用了释放内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不会重排序。
T QAtomicInteger::fetchAndSubAcquire(T valueToSub)
原子fetch-and-sub。
读取此QAtomicInteger的当前值,然后从当前值减去valueToSub,返回原始值。
此函数使用了获取内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不能在原子操作之前重排序。
另请参阅operator-=()和fetchAndAddAcquire。
T QAtomicInteger::fetchAndSubOrdered(T valueToSub)
原子fetch-and-sub。
读取此QAtomicInteger的当前值,然后从当前值减去valueToSub,返回原始值。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
另请参阅operator-=()和fetchAndAddOrdered。
T QAtomicInteger::fetchAndSubRelaxed(T valueToSub)
原子fetch-and-sub。
读取此QAtomicInteger的当前值,然后从当前值减去valueToSub,返回原始值。
此函数使用了宽松的内存顺序语义,允许编译器和处理器自由地重排序内存访问。
另请参阅operator-=()和fetchAndAddRelaxed。
T QAtomicInteger::fetchAndSubRelease(T valueToSub)
原子fetch-and-sub。
读取此QAtomicInteger的当前值,然后从当前值减去valueToSub,返回原始值。
此函数使用了释放内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不会重排序。
另请参阅operator-=()和fetchAndAddRelease。
T QAtomicInteger::fetchAndXorAcquire(T valueToXor)
原子fetch-and-xor。
读取此QAtomicInteger的当前值,然后对当前值执行与valueToXor的位异或,返回原始值。
此函数使用了获取内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不能在原子操作之前重排序。
另请参阅operator^=。
T QAtomicInteger::fetchAndXorOrdered(T valueToXor)
原子fetch-and-xor。
读取此QAtomicInteger的当前值,然后对当前值执行与valueToXor的位异或,返回原始值。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
另请参阅operator^=。
T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)
原子fetch-and-xor。
读取此QAtomicInteger的当前值,然后对当前值执行与valueToXor的位异或,返回原始值。
此函数使用了宽松的内存顺序语义,允许编译器和处理器自由地重排序内存访问。
另请参阅operator^=。
T QAtomicInteger::fetchAndXorRelease(T valueToXor)
原子fetch-and-xor。
读取此QAtomicInteger的当前值,然后对当前值执行与valueToXor的位异或,返回原始值。
此函数使用了释放内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不会重排序。
另请参阅operator^=。
[static constexpr]
bool QAtomicInteger::isFetchAndAddNative()
如果fetch-and-add是通过原子处理指令实现的,则返回true
,否则返回false。
[static constexpr]
bool QAtomicInteger::isFetchAndAddWaitFree()
如果原子fetch-and-add是wait-free,则返回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。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
另请参阅deref() 和 operator++。
void QAtomicInteger::storeRelaxed(T newValue)
使用松散内存顺序将新值原子地存储到此原子类型中。
另请参阅storeRelease() 和 loadRelaxed。
void QAtomicInteger::storeRelease(T newValue)
使用 "释放" 内存顺序将新值原子地存储到此原子类型中。
另请参阅storeRelaxed() 和 loadAcquire。
bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue)
原子测试并设置。
注意: 如果您在一个循环中使用了此功能,请考虑使用带有额外 T ¤tValue
参数的重载版本,这样可以避免在失败时进行额外的 load() 操作。
如果此 QAtomicInteger 的当前值是 expectedValue,则测试和设置函数将会将 newValue 赋值给此 QAtomicInteger 并返回 true。如果值 不 相同,此函数不会做任何事情,并返回 false
。
此函数使用了获取内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不能在原子操作之前重排序。
bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue, T ¤tValue)
原子测试并设置。
如果此 QAtomicInteger 的当前值是 expectedValue,则测试和设置函数将 newValue 赋值给此 QAtomicInteger 并返回 true
。如果值 不 相同,这些函数将此 QAtomicInteger 的当前值加载到 currentValue 中,并返回 false
。
此函数使用了获取内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不能在原子操作之前重排序。
bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue)
原子测试并设置。
注意: 如果您在一个循环中使用了此功能,请考虑使用带有额外 T ¤tValue
参数的重载版本,这样可以避免在失败时进行额外的 load() 操作。
如果此 QAtomicInteger 的当前值是 expectedValue,则测试和设置函数将会将 newValue 赋值给此 QAtomicInteger 并返回 true。如果值 不 相同,此函数不会做任何事情,并返回 false
。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue, T ¤tValue)
原子测试并设置。
如果此 QAtomicInteger 的当前值是 expectedValue,则测试和设置函数将 newValue 赋值给此 QAtomicInteger 并返回 true
。如果值 不 相同,它将 QAtomicInteger 的当前值加载到 currentValue 中并返回 false
。
此函数使用了内存顺序语义,这确保了在原子操作前后(按程序顺序)对内存的访问不能重排序。
bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue)
原子测试并设置。
注意: 如果您在一个循环中使用了此功能,请考虑使用带有额外 T ¤tValue
参数的重载版本,这样可以避免在失败时进行额外的 load() 操作。
如果此 QAtomicInteger 的当前值是 expectedValue,则测试和设置函数将会将 newValue 赋值给此 QAtomicInteger 并返回 true。如果值 不 相同,此函数不会做任何事情,并返回 false
。
此函数使用了宽松的内存顺序语义,允许编译器和处理器自由地重排序内存访问。
bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue, T ¤tValue)
原子测试并设置。
如果此 QAtomicInteger 的当前值是 expectedValue,则测试和设置函数将 newValue 赋值给此 QAtomicInteger 并返回 true
。如果值 不 相同,这些函数将此 QAtomicInteger 的当前值加载到 currentValue 中,并返回 false
。
此函数使用了宽松的内存顺序语义,允许编译器和处理器自由地重排序内存访问。
bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue)
原子测试并设置。
注意: 如果您在一个循环中使用了此功能,请考虑使用带有额外 T ¤tValue
参数的重载版本,这样可以避免在失败时进行额外的 load() 操作。
如果此 QAtomicInteger 的当前值是 expectedValue,则测试和设置函数将会将 newValue 赋值给此 QAtomicInteger 并返回 true。如果值 不 相同,此函数不会做任何事情,并返回 false
。
此函数使用了释放内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不会重排序。
bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue, T ¤tValue)
原子测试并设置。
如果此 QAtomicInteger 的当前值是 expectedValue,测试和设置函数将 newValue 赋值给此 QAtomicInteger 并返回 true
。如果值 不 相同,这些函数将 QAtomicInteger 的当前值加载到 currentValue 中并返回 false
。
此函数使用了释放内存顺序语义,确保在原子操作之后(按程序顺序)运行的内存访问不会重排序。
T QAtomicInteger::operator T() const
尝试以顺序一致内存顺序原子地加载此 QAtomicInteger 的值;如果不能,则使用 "Acquire" 顺序。该值不会被修改,但请注意,没有保证它始终保持不变。
参阅loadRelaxed() 和 loadAcquire。
T QAtomicInteger::operator&=(T value)
原子加并取。
读取此QAtomicInteger的当前值,然后将值与当前值进行按位与操作,返回新值。
如果可能,此函数使用顺序一致的内存顺序;如果没有,则使用"有序"顺序。
另请参阅fetchAndAndOrdered。
T QAtomicInteger::operator++()
原子性地预先增加此QAtomicInteger的值。返回此原子的新值。
如果可能,此函数使用顺序一致的内存顺序;如果没有,则使用"有序"顺序。
另请参阅ref(), operator++(int), 和 operator--。
T QAtomicInteger::operator++(int)
原子性地后增加此QAtomicInteger的值。返回此原子的旧值。
如果可能,此函数使用顺序一致的内存顺序;如果没有,则使用"有序"顺序。
另请参阅ref(), operator++(), 和 operator--(int)。
T QAtomicInteger::operator+=(T value)
原子加并取。
读取此QAtomicInteger的当前值,然后将其与当前值相加,返回新值。
如果可能,此函数使用顺序一致的内存顺序;如果没有,则使用"有序"顺序。
另请参阅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+=。
[noexcept]
QAtomicInteger<T> &QAtomicInteger::operator=(const QAtomicInteger<T> &other)
将other赋给此QAtomicInteger,并返回对此QAtomicInteger的引用。
QAtomicInteger<T> &QAtomicInteger::operator=(T)
如果可能,使用顺序一致的内存顺序原子性地将其他值存储为此原子类型;如果没有,则使用"发布"顺序。此函数返回对此对象的引用。
另请参阅storeRelaxed() 和 storeRelease。
T QAtomicInteger::operator^=(T value)
原子异或并获取。
读取此QAtomicInteger的当前值,然后执行位异或操作将value添加到当前值,并返回新值。
如果可能,此函数使用顺序一致的内存顺序;如果没有,则使用"有序"顺序。
T QAtomicInteger::operator|=(T value)
原子或并获取。
读取此QAtomicInteger的当前值,然后执行位或操作将value添加到当前值,并返回新值。
如果可能,此函数使用顺序一致的内存顺序;如果没有,则使用"有序"顺序。
相关非成员
[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
如果一个处理器支持原子fetch-and-add整数,则定义此宏。
nn是整数的位大小(8、16、32或64)。
Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE
当硬件不支持原子fetch-and-add整数时,定义此宏。
nn是整数的位大小(8、16、32或64)。
Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
当只有处理器的一定版本支持原子fetch-and-add整数时,定义此宏。使用QAtomicInteger<T>::isFetchAndAddNative()函数检查您的处理器支持什么。
nn是整数的位大小(8、16、32或64)。
Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE
此宏与Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE一起定义,以指明整数原子fetch-and-add是wait-free的。
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<T>::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<T>::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<T>::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)。
©© 2024 The Qt Company Ltd. 本文档中包含的贡献文档的版权属于其各自的所有者。提供的文档许可条款依据自由软件基金会发布的GNU自由文档许可证版本1.3。Qt及其各自的标志是芬兰及/或其他国家全球The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。