QAtomicPointer Class
template <typename T> class QAtomicPointerQAtomicPointer 类是一个模板类,它为指针提供了与平台无关的原子操作。更多内容...
| 头文件: | #include <QAtomicPointer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 所有成员的列表,包括继承的成员
- QAtomicPointer 属于线程类。
公共函数
| QAtomicPointer(T *value = nullptr) | |
| QAtomicPointer(const QAtomicPointer<T> &other) | |
| T * | fetchAndAddAcquire(qptrdiff valueToAdd) |
| T * | fetchAndAddOrdered(qptrdiff valueToAdd) |
| T * | fetchAndAddRelaxed(qptrdiff valueToAdd) |
| T * | fetchAndAddRelease(qptrdiff valueToAdd) |
| T * | fetchAndStoreAcquire(T *newValue) |
| T * | fetchAndStoreOrdered(T *newValue) |
| T * | fetchAndStoreRelaxed(T *newValue) |
| T * | fetchAndStoreRelease(T *newValue) |
| T * | loadAcquire() const |
| T * | loadRelaxed() const |
| 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) |
| QAtomicPointer<T> & | operator=(const QAtomicPointer<T> &other) |
静态公共成员
| bool | isFetchAndAddNative() |
| bool | isFetchAndAddWaitFree() |
| bool | isFetchAndStoreNative() |
| bool | isFetchAndStoreWaitFree() |
| bool | isTestAndSetNative() |
| bool | isTestAndSetWaitFree() |
宏
详细说明
有关整数的原子操作,请参阅QAtomicInteger 类。
原子操作是一种能够不间断地完成的复杂操作。QAtomicPointer类为指针提供了原子测试并设置、读取并存储以及读取并加法操作。模板参数T 指定了被指针所指向的类型。
原子API
内存排序
QAtomicPointer 提供了原子测试并设置、读取并存储以及读取并加法函数的多种实现。 每种实现都定义了一种内存顺序语义,用于描述处理器如何执行原子指令周围的内存访问。由于许多现代架构允许乱序执行和内存顺序调整,因此必须使用正确的语义,以确保您的应用程序在所有处理器上都能正常运行。
- 宽松(Relaxed)——内存顺序未指定,由编译器和处理器自由重新排序内存访问。
- 获取(Acquire)——(按程序顺序)位于原子操作之后的内存访问,不得被重新排序至原子操作之前。
- Release(释放)——原子操作之前(按程序顺序)的内存访问,不得被重新排序至原子操作之后。
- 有序(Ordered)——结合了“获取”(Acquire)和“释放”(Release)两种语义。
测试并设置
如果 QAtomicPointer 的当前值与预期值一致,则“测试并设置”函数会将新值赋给 QAtomicPointer 并返回 true。如果值不一致,则这些函数不执行任何操作并返回 false。该操作等同于以下代码:
if (currentValue == expectedValue) {
currentValue = newValue;
return true;
}
return false;共有 4 个测试并设置函数:testAndSetRelaxed()、testAndSetAcquire()、testAndSetRelease() 和testAndSetOrdered()。关于不同内存排序语义的说明,请参见上文。
读取-存储
原子读取-存储函数会读取 QAtomicPointer 的当前值,然后赋予新值,并返回原始值。该操作等同于以下代码:
T *originalValue = currentValue;
currentValue = newValue;
return originalValue;共有 4 个读取并存储函数:fetchAndStoreRelaxed()、fetchAndStoreAcquire()、fetchAndStoreRelease() 和fetchAndStoreOrdered()。关于不同内存排序语义的说明,请参见上文。
读取并加
原子读取并加操作函数会读取 QAtomicPointer 的当前值,然后将给定值加到当前值上,并返回原始值。此操作等同于以下代码:
T *originalValue = currentValue;
currentValue += valueToAdd;
return originalValue;共有 4 个“读取并加”函数:fetchAndAddRelaxed()、fetchAndAddAcquire()、fetchAndAddRelease() 和fetchAndAddOrdered()。关于不同内存顺序语义的说明,请参见上文。
原子 API 的特性测试
提供一个可在所有处理器上运行的、与平台无关的原子 API 是一项挑战。QAtomicPointer 提供的 API 保证在所有处理器上都能原子化地运行。然而,由于并非所有处理器都实现了对 QAtomicPointer 提供的每项操作的支持,因此有必要公开有关处理器的信息。
您可以通过各种宏在编译时检查硬件支持哪些功能。这些宏将告知您硬件是始终支持、有时支持还是不支持某项特定操作。宏的格式为Q_ATOMIC_POINTER_OPERATION_IS_HOW_NATIVE。 其中OPERATION可以是TEST_AND_SET 、FETCH_AND_STORE 或FETCH_AND_ADD 之一,HOW可以是 ALWAYS、SOMETIMES 或 NOT 之一。每项操作始终仅定义一个对应的宏。例如,如果定义了Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE ,则既不会定义Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE ,也不会定义Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE 。
在常数时间内完成的操作被称为无等待操作。此类操作不使用任何形式的锁或循环来实现。 对于始终受支持且无等待的原子操作,Qt 除了定义Q_ATOMIC_POINTER_OPERATION_IS_ALWAYS_NATIVE 之外,还定义了Q_ATOMIC_POINTER_OPERATION_IS_WAIT_FREE。
如果某项原子操作仅在新一代处理器中受支持,QAtomicPointer 还提供了在运行时通过 `isTestAndSetNative()`、`isFetchAndStoreNative()` 和 `isFetchAndAddNative()` 函数检查硬件支持情况的方法。可使用 `isTestAndSetWaitFree()`、`isFetchAndStoreWaitFree()` 和 `isFetchAndAddWaitFree()` 函数检测无等待实现。
以下是 QAtomicPointer 所有特性宏的完整列表:
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_WAIT_FREE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_WAIT_FREE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_WAIT_FREE
另请参阅 QAtomicInteger 和qYieldCpu()。
成员函数文档
[constexpr noexcept] QAtomicPointer::QAtomicPointer(T *value = nullptr)
根据给定的value ,构建一个QAtomicPointer。
[noexcept] QAtomicPointer::QAtomicPointer(const QAtomicPointer<T> &other)
创建other 的副本。
T *QAtomicPointer::fetchAndAddAcquire(qptrdiff valueToAdd)
原子读取并加法。
读取该QAtomicPointer 的当前值,然后将valueToAdd 加到当前值上,并返回原始值。
该函数采用“获取 memory ordering ”语义,这确保了在原子操作之后(按程序顺序)进行的内存访问,不会被重新排序到原子操作之前。
T *QAtomicPointer::fetchAndAddOrdered(qptrdiff valueToAdd)
原子读取并加法。
读取该QAtomicPointer 的当前值,然后将valueToAdd 加到当前值上,并返回原始值。
该函数采用有序 memory ordering 语义,这确保了原子操作前后(按程序顺序)的内存访问不会被重新排序。
T *QAtomicPointer::fetchAndAddRelaxed(qptrdiff valueToAdd)
原子读取并加法操作。
读取该QAtomicPointer 的当前值,然后将valueToAdd 加到当前值上,并返回原始值。
该函数采用宽松的 memory ordering 语义,允许编译器和处理器自由重排内存访问顺序。
T *QAtomicPointer::fetchAndAddRelease(qptrdiff valueToAdd)
原子读取并加法操作。
读取该QAtomicPointer 的当前值,然后将valueToAdd 加到当前值上,并返回原始值。
该函数采用“释放” memory ordering 语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。
T *QAtomicPointer::fetchAndStoreAcquire(T *newValue)
原子读取-存储操作。
读取该QAtomicPointer 的当前值,然后将其赋值为newValue ,并返回原始值。
该函数采用“获取-memory ordering ”语义,这确保了在原子操作之后(按程序顺序)的内存访问,不会被重新排序至原子操作之前。
T *QAtomicPointer::fetchAndStoreOrdered(T *newValue)
原子读取-存储操作。
读取该QAtomicPointer 的当前值,然后将其赋值为newValue ,并返回原始值。
该函数采用有序 memory ordering 语义,这确保了原子操作前后(按程序顺序)的内存访问不会被重新排序。
T *QAtomicPointer::fetchAndStoreRelaxed(T *newValue)
原子读取和写入。
读取该QAtomicPointer 的当前值,然后将其赋值给newValue ,并返回原始值。
该函数采用宽松的 memory ordering 语义,允许编译器和处理器自由重排内存访问的顺序。
T *QAtomicPointer::fetchAndStoreRelease(T *newValue)
原子读取-写入操作。
读取该QAtomicPointer 的当前值,然后将其赋值为newValue ,并返回原始值。
该函数采用“释放” memory ordering 语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。
[static constexpr] bool QAtomicPointer::isFetchAndAddNative()
如果 `fetch-and-add` 是通过原子处理器指令实现的,则返回 `true `;否则返回 `false`。
[static constexpr] bool QAtomicPointer::isFetchAndAddWaitFree()
如果原子“读取并加”操作是无等待的,则返回true ;否则返回false。
[static constexpr] bool QAtomicPointer::isFetchAndStoreNative()
如果“fetch-and-store”操作是通过原子处理器指令实现的,则返回true ;否则返回false。
[static constexpr] bool QAtomicPointer::isFetchAndStoreWaitFree()
如果原子读写操作是无等待的,则返回true ;否则返回false。
[static constexpr] bool QAtomicPointer::isTestAndSetNative()
如果“测试并设置”操作是通过原子处理器指令实现的,则返回true ;否则返回false。
[static constexpr] bool QAtomicPointer::isTestAndSetWaitFree()
如果原子测试并设置操作是无等待的,则返回true ;否则返回false。
T *QAtomicPointer::loadAcquire() const
使用“Acquire”内存排序原子地加载此QAtomicPointer 的值。该值不会以任何方式被修改,但请注意,无法保证其值保持不变。
另请参阅 storeRelease() 和loadRelaxed()。
T *QAtomicPointer::loadRelaxed() const
使用松弛内存排序原子地加载此QAtomicPointer 的值。该值不会以任何方式被修改,但请注意,无法保证其值保持不变。
另请参阅 storeRelaxed() 和loadAcquire()。
void QAtomicPointer::storeRelaxed(T *newValue)
将newValue 的值以原子操作的方式存储到此原子类型中,并采用宽松的内存排序规则。
另请参阅 storeRelease() 和loadRelaxed()。
void QAtomicPointer::storeRelease(T *newValue)
将newValue 的值以原子方式存储到此原子类型中,并采用“Release”内存排序。
另请参阅 storeRelaxed() 和loadRelaxed()。
bool QAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue)
原子测试并设置。
注意:若在 循环中使用此函数,建议改用带有额外参数 `T *¤tValue ` 的重载版本,以避免在失败时执行额外的 `load()` 操作。
如果该QAtomicPointer 的当前值是expectedValue ,则“测试并设置”函数会将newValue 赋值给该QAtomicPointer ,并返回true。如果这两个值不相同,则该函数不执行任何操作,并返回false 。
该函数采用“获取” memory ordering 语义,这确保了在原子操作之后(按程序顺序)的内存访问,不会在原子操作之前被重新排序。
bool QAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue, T *¤tValue)
原子测试并设置。
如果该QAtomicPointer 的当前值是expectedValue ,则“测试并设置”函数会将newValue 赋值给该QAtomicPointer ,并返回true 。如果两个值不相同,则这些函数会将该QAtomicPointer 的当前值加载到currentValue 中,并返回false 。
该函数采用“获取” memory ordering 语义,这确保了在原子操作之后(按程序顺序)的内存访问不会被重新排序至原子操作之前。如果“测试并设置”操作失败,则会采用“获取” memory ordering 语义将currentValue 加载。
bool QAtomicPointer::testAndSetOrdered(T *expectedValue, T *newValue)
原子测试并设置。
注意:若在 循环中使用此函数,建议改用带有额外参数T *¤tValue 的重载版本,以避免在失败时执行多余的 load() 操作。
如果该QAtomicPointer 的当前值是expectedValue ,则“测试并设置”函数会将newValue 赋值给该QAtomicPointer 并返回true。如果两个值不相同,则该函数不执行任何操作并返回false 。
该函数采用有序的 memory ordering 语义,这确保了(按程序顺序)原子操作前后对内存的访问不会被重新排序。
bool QAtomicPointer::testAndSetOrdered(T *expectedValue, T *newValue, T *¤tValue)
原子测试并设置。
如果该QAtomicPointer 的当前值是expectedValue ,则“测试并设置”函数会将newValue 赋值给该QAtomicPointer ,并返回true 。如果两个值不相同,则这些函数会将该QAtomicPointer 的当前值加载到currentValue 中,并返回false 。
该函数采用有序的 memory ordering 语义,这确保了原子操作前后(按程序顺序)的内存访问不得被重新排序。如果“测试并设置”操作失败,则currentValue 将采用acquire memory ordering 语义进行加载。
bool QAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue)
原子测试并设置。
注意:若在 循环中使用此函数,建议改用带有额外参数T *¤tValue 的重载版本,以避免失败时执行多余的load()操作。
如果该QAtomicPointer 的当前值是expectedValue ,则“测试并设置”函数将newValue 赋值给该QAtomicPointer ,并返回true。如果两个值不相同,则该函数不执行任何操作,并返回false 。
该函数采用宽松的 memory ordering 语义,允许编译器和处理器自由重新排序内存访问操作。
bool QAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue, T *¤tValue)
原子测试并设置。
如果该QAtomicPointer 的当前值是expectedValue ,则“测试并设置”函数会将newValue 赋值给该QAtomicPointer ,并返回true 。如果两者值不同,则这些函数会将该QAtomicPointer 的当前值加载到currentValue 中,并返回false 。
该函数采用宽松的 memory ordering 语义,允许编译器和处理器自由重新排序内存访问。如果“测试并设置”操作失败,则currentValue 将采用宽松的 memory ordering 语义进行加载。
bool QAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue)
原子测试与设置。
注意:若 在循环中使用此函数,建议改用带有额外参数T *¤tValue 的重载版本,以避免在失败时额外调用load()。
如果该QAtomicPointer 的当前值是expectedValue ,则“测试并设置”函数会将newValue 赋值给该QAtomicPointer ,并返回true。如果两个值不相同,则该函数不执行任何操作,并返回false 。
该函数采用memory ordering 语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。
bool QAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue, T *¤tValue)
原子测试并设置。
如果该QAtomicPointer 的当前值是expectedValue ,则“测试并设置”函数将newValue 赋值给该QAtomicPointer ,并返回true 。如果两个值不相同,则这些函数将该QAtomicPointer 的当前值读入currentValue ,并返回false 。
该函数采用“释放” memory ordering 语义,这确保了(按程序顺序)在原子操作之前进行的内存访问,在原子操作之后不会被重新排序。如果“测试并设置”操作失败,则currentValue 将采用“松弛” memory ordering 语义进行加载。
[noexcept] QAtomicPointer<T> &QAtomicPointer::operator=(const QAtomicPointer<T> &other)
将 `other ` 赋值给此 `QAtomicPointer `,并返回对此 `QAtomicPointer` 的引用。
宏文档
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
只有当你的处理器支持针对指针的原子取值-加法操作时,才会定义此宏。
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
当硬件不支持指针的原子读取-添加操作时,会定义此宏。
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
当只有特定代的处理器支持指针的原子取值-加法操作时,才会定义此宏。请使用QAtomicPointer::isFetchAndAddNative()函数来检查您的处理器支持哪些功能。
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_WAIT_FREE
该宏与Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE 一同定义,用于表明针对指针的原子读取-添加操作是无等待的。
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
只有当你的处理器支持指针的原子读取-存储操作时,才会定义此宏。
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
当硬件不支持指针的原子读取-存储操作时,会定义此宏。
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
当只有特定代的处理器支持指针的原子读写操作时,才会定义此宏。请使用QAtomicPointer::isFetchAndStoreNative()函数来检查您的处理器支持哪些功能。
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_WAIT_FREE
该宏与Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE 一同定义,用于表明针对指针的原子读取-存储操作是无等待的。
Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
只有当您的处理器支持针对指针的原子测试并设置操作时,才会定义此宏。
Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
当硬件不支持对指针进行原子测试并设置操作时,会定义此宏。
Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE
当只有特定代的处理器支持针对指针的原子测试并设置操作时,才会定义此宏。请使用QAtomicPointer::isTestAndSetNative()函数来检查您的处理器支持哪些功能。
Q_ATOMIC_POINTER_TEST_AND_SET_IS_WAIT_FREE
该宏与Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE 一同定义,用于表明针对指针的原子“测试并设置”操作是无等待的。
© 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.