このページでは

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.