QAtomicScopedValueRollback Class

template <typename T> class QAtomicScopedValueRollback

アトミック変数用のQScopedValueRollback を提供します。さらに...

Header: #include <QAtomicScopedValueRollback>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Since: 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 クラスは、アトミック変数が破棄されると、その以前の値にリセットします。これは、try-catch ブロックを記述する必要なく、例外がスローされたときに状態を戻すために使用できます。

また、リエントランシー・ガードのように、一時的にセットされた変数を管理するためにも使用できます。このクラスを使うと、関数が正常終了しても、return文で早期終了しても、例外で終了しても、変数はリセットされます。

このクラスはstd::atomicとQt atomicクラスで動作します:QBasicAtomicInteger、QAtomicIntegerQAtomicInt 、QBasicAtomicPointer、QAtomicPointer

アトミック変数var へのメモリ・アクセスは、mo の値を使用して指定されます。 メモリの順序は、このマッピングに従います:

  • アトミック変数への書き込み時:
    • acquire順序は、代わりにrelax操作を実行する。
    • acquire-releaseハイブリッド順序は、代わりにrelease操作を実行する。
  • アトミック変数から読み出すとき:
    • release順序が代わりにrelaxed操作を実行する。
    • consume順序はconsume操作を実行します。
    • acquire-releaseのハイブリッド順序は、代わりにacquire操作を実行します。


それ以外の場合、デフォルトのメモリ順序は逐次一貫順序です。

注: テンプレート引数に明示的に名前を付けてはいけません。もっぱらCTAD(Class Template Argument Deduction)を使用して、コンパイラにテンプレート引数を選択させるようにしてください。

つまり、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)

valuevar に代入し、破壊時に戻すために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 を参照のこと。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。