QAtomicScopedValueRollback 类

template <typename T> class QAtomicScopedValueRollback

为原子变量提供 QScopedValueRollback。更多信息...

头文件 #include <QAtomicScopedValueRollback>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
自从Qt 6.7

公共函数

QAtomicScopedValueRollback(std::atomic<T> &var, 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(QBasicAtomicInteger<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, 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()
voidcommit()

详细描述

QAtomicScopedValueRollback 类在析构时将原子变量重置为其先前值。它可以用于在抛出异常时撤销状态,而无需编写 try-catch 块。

它还可以用于管理临时设置的变量,例如嵌套性保护。使用此类可以确保变量将在函数正常退出、通过返回语句提前退出或通过异常退出的任何情况下被重置。

此类适用于 std::atomic 和 Qt 原子类:QBasicAtomicInteger、QAtomicIntegerQAtomicInt、QBasicAtomicPointer 和 QAtomicPointer

使用 mo 的值指定对原子变量 var 的内存访问。内存顺序遵循以下映射

  • 写入原子变量时
    • 执行一个松弛的操作。
    • 执行一个释放操作。
  • 从原子变量中读取时
    • 执行一个松弛的操作。
    • 执行一个消费操作。
    • 执行一个获取操作。


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

注意:您永远不应该明确命名模板参数,而应独家使用类模板参数推导(CTAD),并让编译器选择模板参数。

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

另请参阅:QScopedValueRollback.

成员函数文档

[默认 constructors] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, std::memory_order mo = std::memory_order_seq_cst)

[默认 constructors] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, std::memory_order mo = std::memory_order_seq_cst)

[默认 constructors] 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 调整。

[默认 constructors] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)

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

[默认 constructors] 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 的含义,请参阅 内存顺序

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 的含义,请参阅 内存顺序

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献均为各自所有者的版权。提供的文档是根据自由软件基金会发布的GNU自由文档许可协议1.3版条款许可的。Qt及其相关标志是芬兰及/或其他国家/地区的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。