本页内容

QAtomicScopedValueRollback Class

template <typename T> class QAtomicScopedValueRollback

为原子变量提供QScopedValueRollback 。更多内容...

头文件: #include <QAtomicScopedValueRollback>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
自: Qt 6.7

公共函数

QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(std::atomic<T> &var, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(std::atomic<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
~QAtomicScopedValueRollback()
void commit()

详细说明

QAtomicScopedValueRollback<T> 在销毁时将类型为T 的原子变量重置为其先前值。当抛出异常时,可使用该函数恢复状态,而无需编写try-catch代码块。

它还可用于管理临时设置的变量,例如可重入保护条件。通过使用该类,无论函数是正常退出、通过 return 语句提前退出,还是因异常而退出,该变量都会被重置。

该类支持 std::atomic 以及 Qt 的原子类:QBasicAtomicInteger、QAtomicInteger 、QAtomicInt 、QBasicAtomicPointer 和QAtomicPointer 。

对原子变量var 的内存访问通过mo 的值进行指定。内存顺序遵循以下映射关系:

  • 向原子变量写入数据时:
    • 获取顺序会执行放松操作。
    • 混合获取-释放顺序则会执行释放操作。
  • 从原子变量读取时:
    • 释放顺序会执行放松操作。
    • 消耗顺序会执行消耗操作。
    • 混合获取-释放顺序则会执行获取操作。


否则,默认的内存顺序为顺序一致性顺序。

注意: 切勿显式命名模板参数,而应 仅使用类模板参数推导(CTAD),并让编译器自动选择模板参数。

注意: 其他线程也有可能 修改该变量,这意味着在调用 QAtomicScopedValueRollback 构造函数与commit() 之间,或者在commit() 与析构函数之间,您可能会丢失其他线程所执行的更新。

另请参阅 QScopedValueRollback 。

成员函数文档

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, std::memory_order mo = std::memory_order_seq_cst)

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, std::memory_order mo = std::memory_order_seq_cst)

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(std::atomic<T> &var, std::memory_order mo = std::memory_order_seq_cst)

记录var 的值,以便在对象销毁时将其恢复。

这相当于:

T old_value = var.load(mo);
// And in the destructor: var.store(old_value, mo);

关于该加载的mo 调整,详见Memory Order 部分。

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, T value, std::memory_order mo = std::memory_order_seq_cst)

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(std::atomic<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)

将 `value ` 赋值给 `var `,并在内部存储 `var ` 的先前值,以便在销毁时恢复。

这等同于:

T old_value = var.exchange(new_value, mo);
// And in the destructor: var.store(old_value, mo);

QAtomicScopedValueRollback::~QAtomicScopedValueRollback()

将构造时或上次调用commit()时有效的存储值恢复到托管变量中。

这等同于:

// In the constructor: T old_value = var.load(mo);
// or: T old_value = exchange(new_value, mo);
var.store(old_value, mo);

其中mo 与最初传递给构造函数的那个相同。有关mo 的含义,请参阅Memory Order 。

void QAtomicScopedValueRollback::commit()

将存储的值更新为受管变量的当前值,加载时采用与构造时相同的内存顺序。

在销毁时,将恢复此更新后的值,而非之前的原始值。

这等同于:

// Given constructor: T old_value = var.load(mo);
old_value = var.load(mo);  // referesh it
// And, in the destructor: var.store(old_value, mo);

其中mo 与最初传递给构造函数的值相同。关于mo 的含义,请参阅Memory Order 。

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