QAtomicInteger Class

template <typename T> class QAtomicInteger

QAtomicInteger クラスは、プラットフォームに依存しない整数のアトミック演算を提供します。詳細...

ヘッダ #include <QAtomicInteger>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
継承元:

QAtomicInt

パブリック関数

QAtomicInteger(T value = 0)
QAtomicInteger(const QAtomicInteger<T> &other)
bool deref()
T fetchAndAddAcquire(T valueToAdd)
T fetchAndAddOrdered(T valueToAdd)
T fetchAndAddRelaxed(T valueToAdd)
T fetchAndAddRelease(T valueToAdd)
T fetchAndAndAcquire(T valueToAnd)
T fetchAndAndOrdered(T valueToAnd)
T fetchAndAndRelaxed(T valueToAnd)
T fetchAndAndRelease(T valueToAnd)
T fetchAndOrAcquire(T valueToOr)
T fetchAndOrOrdered(T valueToOr)
T fetchAndOrRelaxed(T valueToOr)
T fetchAndOrRelease(T valueToOr)
T fetchAndStoreAcquire(T newValue)
T fetchAndStoreOrdered(T newValue)
T fetchAndStoreRelaxed(T newValue)
T fetchAndStoreRelease(T newValue)
T fetchAndSubAcquire(T valueToSub)
T fetchAndSubOrdered(T valueToSub)
T fetchAndSubRelaxed(T valueToSub)
T fetchAndSubRelease(T valueToSub)
T fetchAndXorAcquire(T valueToXor)
T fetchAndXorOrdered(T valueToXor)
T fetchAndXorRelaxed(T valueToXor)
T fetchAndXorRelease(T valueToXor)
T loadAcquire() const
T loadRelaxed() const
bool ref()
void storeRelaxed(T newValue)
void storeRelease(T newValue)
bool testAndSetAcquire(T expectedValue, T newValue)
bool testAndSetAcquire(T expectedValue, T newValue, T &currentValue)
bool testAndSetOrdered(T expectedValue, T newValue)
bool testAndSetOrdered(T expectedValue, T newValue, T &currentValue)
bool testAndSetRelaxed(T expectedValue, T newValue)
bool testAndSetRelaxed(T expectedValue, T newValue, T &currentValue)
bool testAndSetRelease(T expectedValue, T newValue)
bool testAndSetRelease(T expectedValue, T newValue, T &currentValue)
T operator T() const
T operator&=(T value)
T operator++()
T operator++(int)
T operator+=(T value)
T operator--()
T operator--(int)
T operator-=(T value)
QAtomicInteger<T> &operator=(T)
QAtomicInteger<T> &operator=(const QAtomicInteger<T> &other)
T operator^=(T value)
T operator|=(T value)

静的パブリックメンバ

(since 6.7) void qYieldCpu()

マクロ

詳細説明

ポインタに対するアトミック操作については、QAtomicPointer クラスを参照のこと。

アトミック操作は、中断することなく完了する複雑な操作です。QAtomicInteger クラスは、整数のアトミックな参照カウント、test-and-set、fetch-and-store、fetch-and-add を提供します。

テンプレート・パラメータT は C++ 整数型でなければなりません:

  • 8 ビット: bool、char、signed char、unsigned char、qint8、quint8、char8_t(C++20)。
  • 16 ビット: short、unsigned short、qint16、quint16、char16_t
  • 32ビット: int、unsigned int、qint32、quint32、char32_t
  • 64ビット: long long、unsigned long long、qint64、quint64
  • プラットフォーム固有サイズ: long, unsigned long
  • ポインタサイズ:qintptr、quintptr、qptrdiff

上記のリストのうち、8ビット、16ビット、32ビット、ポインタ・サイズのインスタンス化だけが、すべてのプラットフォームで動作することが保証されています。それ以外のサイズのサポートは、コンパイラとコードがコンパイルされるプロセッサ・アーキテクチャに依存します。64ビット型が32ビット・プラットフォームでサポートされているかどうかを調べるには、マクロQ_ATOMIC_INT64_IS_SUPPORTED をチェックしてください。

アトミックAPI

参照カウント

ref() およびderef() 関数は、効率的な参照カウント API を提供します。これらの関数の戻り値は、最後の参照がいつ解放されたかを示すために使用されます。これらの関数を使用すると、独自の暗黙的共有クラスを実装できます。

MySharedType &MySharedType::operator=(const MySharedType &other)
{
    (void) other.data->atomicInt.ref();
    if (!data->atomicInt.deref()) {
        // The last reference has been released
        delete d;
    }
    d = other.d;
    return *this;
}

メモリ順序付け

QAtomicInteger には、アトミックな test-and-set、fetch-and-store、fetch-and-add 関数の実装がいくつか用意されています。各実装では、アトミック命令を囲むメモリ・アクセスがプロセッサによってどのように実行されるかを記述するメモリ順序セマンティックを定義します。最近のアーキテクチャの多くはアウトオブオーダー実行とメモリ順序付けを許可しているため、アプリケーションがすべてのプロセッサで正しく機能するようにするには、正しいセマンティックを使用する必要があります。

  • Relaxed - メモリの順序が指定されていないため、コンパイラとプロセッサが自由にメモリ・アクセスの順序を変更できます。
  • Acquire - アトミック操作の後に続くメモリ・アクセス(プログラム順)は、アトミック操作の前に並べ替えることはできません。
  • Release - アトミック操作の前(プログラム順)のメモリ・アクセスは、アトミック操作の後に並べ替えることはできません。
  • Ordered - Acquire と Release のセマンティクスを組み合わせたもの。

テスト・アンド・セット

QAtomicInteger の現在の値が期待される値である場合、test-and-set 関数は QAtomicInteger に新しい値を割り当て、true を返します。値がnot と同じ場合は、これらの関数は何もせず、false を返します。この操作は、以下のコードに相当します:

if (currentValue == expectedValue) {
    currentValue = newValue;
    return true;
}
return false;

testAndSetRelaxed ()、testAndSetAcquire ()、testAndSetRelease ()、testAndSetOrdered ()。メモリ順序セマンティクスの違いについては、上記を参照のこと。

フェッチ・アンド・ストア

アトミック・フェッチ&ストア関数は、QAtomicInteger の現在の値を読み取り、新しい値を代入して元の値を返します。この操作は、以下のコードに相当します:

int originalValue = currentValue;
currentValue = newValue;
return originalValue;

fetchAndStoreRelaxed ()、fetchAndStoreAcquire ()、fetchAndStoreRelease ()、fetchAndStoreOrdered ()の4つのフェッチ・アンド・ストア関数があります。メモリ順序セマンティクスの違いについては、上記を参照のこと。

フェッチ・アンド・アド

アトミック・フェッチ&加算関数は、QAtomicInteger の現在値を読み取り、指定された値を現在値に加算して元の値を返します。この操作は、以下のコードに相当します:

int originalValue = currentValue;
currentValue += valueToAdd;
return originalValue;

fetchAndAddRelaxed ()、fetchAndAddAcquire ()、fetchAndAddRelease ()、fetchAndAddOrdered ()。メモリ順序セマンティクスの違いについては上記を参照。

アトミックAPIの機能テスト

すべてのプロセッサで動作する、プラットフォームに依存しないアトミックAPIを提供することは困難である。QAtomicInteger が提供する API は、すべてのプロセッサでアトミックに動作することが保証されています。ただし、すべてのプロセッサが QAtomicInteger が提供するすべての操作のサポートを実装しているわけではないため、プロセッサに関する情報を公開する必要があります。

コンパイル時に、さまざまなマクロを使用して、どの機能がハードウェアでサポートされているかを確認できます。これらのマクロは、ハードウェアが特定の演算を常にサポートしているのか、時々サポートしているのか、あるいはサポートしていないのかを示します。マクロはQ_ATOMIC_INTnn_OPERATION_IS_HOW_NATIVE という形式です。nnは整数サイズ(ビット単位)、OPERATIONREFERENCE_COUNTINGTEST_AND_SETFETCH_AND_STOREFETCH_AND_ADD のいずれか、HOWは ALWAYS、SOMETIMES、NOT のいずれかです。1つの操作につき、定義されたマクロは常に1つである。例えば、Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVEが定義されている場合、Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_SOMETIMES_NATIVEもQ_ATOMIC_INT32_REFERENCE_COUNTING_IS_NOT_NATIVEも定義されません。

一定の時間で完了する操作は、待ちがないと言われます。このような操作は、ロックやループを使用して実装されることはない。常にサポートされ、待ちのないアトミック操作の場合、Qt はQ_ATOMIC_INTnn_OPERATION_IS_ALWAYS_NATIVE に加えてQ_ATOMIC_INTnn_OPERATION_IS_WAIT_FREE を定義します。

アトミック演算が新しい世代のプロセッサでのみサポートされている場合、QAtomicIntegerは、isReferenceCountingNative ()、isTestAndSetNative ()、isFetchAndStoreNative ()、isFetchAndAddNative ()関数を使用して、ハードウェアがサポートしているものを実行時に確認する方法も提供します。待機なしの実装は、isReferenceCountingWaitFree()、isTestAndSetWaitFree()、isFetchAndStoreWaitFree()、isFetchAndAddWaitFree() 関数を使用して検出できます。

以下は、QAtomicInteger のすべての機能マクロの完全なリストです:

  • Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
  • Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_WAIT_FREE
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_SOMETIMES_NATIVE
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_WAIT_FREE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_WAIT_FREE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE

旧バージョンの Qt との互換性のため、nn が空のマクロは 32 ビットマクロと同等です。例えば、Q_ATOMIC_INT_REFERENCE_COUNTING_IS_WAIT_FREE は Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_WAIT_FREE と同じです。

QAtomicPointerも参照

メンバ関数ドキュメント

[constexpr noexcept] QAtomicInteger::QAtomicInteger(T value = 0)

与えられたvalue で QAtomicInteger を構築します。

[noexcept] QAtomicInteger::QAtomicInteger(const QAtomicInteger<T> &other)

other のコピーを作成する。

bool QAtomicInteger::deref()

このQAtomicInteger の値をアトミックにデクリメントする。新しい値が 0 でない場合はtrue を返し、そうでない場合は false を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリアクセスが再順序付けされないことを保証する。

ref() およびoperator--()も参照のこと

T QAtomicInteger::fetchAndAddAcquire(T valueToAdd)

アトミック・フェッチ・アンド・アッド。

このQAtomicInteger の現在値を読み取り、valueToAdd を現在値に加算して元の値を返す。

この関数は、acquire memory ordering セマンティクスを使用します。このセマンティクスは、アトミック操作(プログラム順)に続くメモリアクセスが、アトミック操作の前に再順序付けされないことを保証します。

operator+=() およびfetchAndSubAcquire()も参照のこと

T QAtomicInteger::fetchAndAddOrdered(T valueToAdd)

アトミック・フェッチ・アンド・アッド。

このQAtomicInteger の現在値を読み取り、valueToAdd を現在値に加算して元の値を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリ・アクセスが再順序付けされないことを保証する。

operator+=() およびfetchAndSubOrdered()も参照のこと

T QAtomicInteger::fetchAndAddRelaxed(T valueToAdd)

アトミック・フェッチ・アンド・アッド。

このQAtomicInteger の現在値を読み取り、valueToAdd を現在値に加算して元の値を返す。

この関数は、memory ordering のセマンティクスを緩和し、コンパイラとプロセッサが自由にメモリ・アクセスの順序を変更できるようにしています。

operator+=() およびfetchAndSubRelaxed()も参照のこと

T QAtomicInteger::fetchAndAddRelease(T valueToAdd)

アトミック・フェッチ・アンド・アッド。

このQAtomicInteger の現在値を読み取り、valueToAdd を現在値に加算して元の値を返す。

この関数は、memory ordering リリース・セマンティクスを使用し、アトミック操作(プログラム順)前のメモリ・アクセスが、アトミック操作後に再順序付けされないことを保証する。

operator+=() およびfetchAndSubRelease()も参照のこと

T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)

アトミック・フェッチ・アンド・アンド。

このQAtomicInteger の現在値を読み取り、valueToAnd を現在値にビットANDし、元の値を返す。

この関数は、acquire memory ordering セマンティクスを使用します。このセマンティクスは、アトミック操作(プログラム順)に続くメモリアクセスが、アトミック操作の前に再順序付けされないことを保証します。

operator&=()も参照のこと

T QAtomicInteger::fetchAndAndOrdered(T valueToAnd)

アトミック・フェッチ・アンド・アンド。

このQAtomicInteger の現在値を読み取り、valueToAnd を現在値にビットANDし、元の値を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリアクセスが再順序付けされないことを保証する。

operator&=()も参照のこと

T QAtomicInteger::fetchAndAndRelaxed(T valueToAnd)

アトミック・フェッチ・アンド・アンド。

このQAtomicInteger の現在値を読み取り、valueToAnd を現在値にビット単位でANDし、元の値を返す。

この関数は、memory ordering のセマンティクスを緩和し、コンパイラとプロセッサが自由にメモリアクセスの順序を変更できるようにします。

operator&=()も参照のこと

T QAtomicInteger::fetchAndAndRelease(T valueToAnd)

アトミック・フェッチ・アンド・アンド。

このQAtomicInteger の現在値を読み取り、valueToAnd を現在値にビットANDし、元の値を返す。

この関数はrelease memory ordering セマンティクスを使用し、アトミック操作(プログラム順)前のメモリアクセスがアトミック操作後に再順序付けされないことを保証する。

operator&=()も参照のこと

T QAtomicInteger::fetchAndOrAcquire(T valueToOr)

アトミック・フェッチ&オア。

このQAtomicInteger の現在値を読み取り、valueToOr を現在値にビット OR し、元の値を返す。

この関数は、acquire memory ordering セマンティクスを使用します。このセマンティクスは、アトミック操作(プログラム順)に続くメモリアクセスが、アトミック操作の前に再順序付けされないことを保証します。

operator|=()も参照のこと

T QAtomicInteger::fetchAndOrOrdered(T valueToOr)

アトミック・フェッチ&オア。

このQAtomicInteger の現在値を読み取り、valueToOr を現在値にビット OR して元の値を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリアクセスが再順序付けされないことを保証する。

operator|=()も参照のこと

T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)

アトミック・フェッチ&オア。

このQAtomicInteger の現在値を読み取り、valueToOr を現在値にビット単位で OR し、元の値を返す。

この関数は、memory ordering のセマンティクスを緩和し、コンパイラとプロセッサが自由にメモリ・アクセスの順序を変更できるようにします。

operator|=()も参照のこと

T QAtomicInteger::fetchAndOrRelease(T valueToOr)

アトミック・フェッチ&オア。

このQAtomicInteger の現在値を読み取り、valueToOr を現在値にビット OR し、元の値を返す。

この関数はリリース memory ordering セマンティクスを使用し、アトミック操作(プログラム順)前のメモリアクセスがアトミック操作後に再順序付けされないことを保証する。

operator|=()も参照のこと

T QAtomicInteger::fetchAndStoreAcquire(T newValue)

原子フェッチ&ストア。

このQAtomicInteger の現在値を読み取り、newValue に代入して元の値を返す。

この関数は、acquire memory ordering セマンティクスを使用します。このセマンティクスは、アトミック操作の後に続くメモリ・アクセス(プログラム順)が、アトミック操作の前に再順序付けされないことを保証します。

T QAtomicInteger::fetchAndStoreOrdered(T newValue)

原子フェッチ&ストア。

このQAtomicInteger の現在値を読み取り、newValue に代入して元の値を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリ・アクセスが再順序付けされないことを保証する。

T QAtomicInteger::fetchAndStoreRelaxed(T newValue)

原子フェッチ&ストア。

このQAtomicInteger の現在値を読み取り、それをnewValue に代入し、元の値を返す。

この関数は、memory ordering のセマンティクスを緩和し、コンパイラとプロセッサが自由にメモリ・アクセスの順序を変更できるようにしています。

T QAtomicInteger::fetchAndStoreRelease(T newValue)

原子フェッチ&ストア。

このQAtomicInteger の現在値を読み取り、newValue に代入して元の値を返す。

この関数はリリース memory ordering セマンティクスを使用し、アトミック操作の前(プログラム順)のメモリ・アクセスが、アトミック操作の後に再順序付けされないことを保証します。

T QAtomicInteger::fetchAndSubAcquire(T valueToSub)

アトミック・フェッチ・アンド・サブ。

このQAtomicInteger の現在値を読み取り、その現在値からvalueToSub を減算して元の値を返す。

この関数は、acquire memory ordering セマンティクスを使用します。このセマンティクスは、アトミック操作(プログラム順)に続くメモリアクセスが、アトミック操作の前に再順序付けされないことを保証します。

operator-=() およびfetchAndAddAcquire()も参照のこと

T QAtomicInteger::fetchAndSubOrdered(T valueToSub)

アトミック・フェッチ・アンド・サブ。

このQAtomicInteger の現在値を読み取り、その現在値からvalueToSub を減算して元の値を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリアクセスが再順序付けされないことを保証する。

operator-=() およびfetchAndAddOrdered()も参照のこと

T QAtomicInteger::fetchAndSubRelaxed(T valueToSub)

アトミック・フェッチ・アンド・サブ。

このQAtomicInteger の現在値を読み取り、その現在値からvalueToSub を減算して元の値を返す。

この関数は、memory ordering のセマンティクスを緩和し、コンパイラとプロセッサが自由にメモリ・アクセスの順序を変更できるようにしています。

operator-=() およびfetchAndAddRelaxed()も参照の こと。

T QAtomicInteger::fetchAndSubRelease(T valueToSub)

アトミック・フェッチ・アンド・サブ。

このQAtomicInteger の現在値を読み取り、valueToSub を現在値から減算して元の値を返す。

この関数は、memory ordering リリース・セマンティクスを使用し、アトミック操作(プログラム順)前のメモリ・アクセスが、アトミック操作後に再順序付けされないことを保証する。

operator-=() およびfetchAndAddRelease()も参照のこと

T QAtomicInteger::fetchAndXorAcquire(T valueToXor)

原子フェッチ&XOR。

このQAtomicInteger の現在値を読み取り、valueToXor を現在値にビット単位でXORし、元の値を返す。

この関数は、acquire memory ordering セマンティクスを使用します。このセマンティクスは、アトミック操作(プログラム順)に続くメモリアクセスが、アトミック操作の前に再順序付けされないことを保証します。

operator^=()も参照のこと

T QAtomicInteger::fetchAndXorOrdered(T valueToXor)

原子フェッチ&XOR。

このQAtomicInteger の現在値を読み取り、valueToXor を現在値にビット単位でXORし、元の値を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリアクセスが再順序付けされないことを保証する。

operator^=()も参照のこと

T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)

原子フェッチ&XOR。

このQAtomicInteger の現在値を読み取り、valueToXor を現在値にビット単位でXORし、元の値を返す。

この関数は、memory ordering のセマンティクスを緩和し、コンパイラとプロセッサが自由にメモリ・アクセスの順序を変更できるようにします。

operator^=()も参照のこと

T QAtomicInteger::fetchAndXorRelease(T valueToXor)

原子フェッチ&XOR。

このQAtomicInteger の現在値を読み取り、valueToXor を現在値にビット単位でXORし、元の値を返す。

この関数はrelease memory ordering セマンティクスを使用し、アトミック操作(プログラム順)前のメモリアクセスがアトミック操作後に再順序付けされないことを保証する。

operator^=()も参照のこと

[static constexpr] bool QAtomicInteger::isFetchAndAddNative()

フェッチ・アンド・アドがアトミック・プロセッサ命令を使用して実装されている場合はtrue を返し、そうでない場合は false を返す。

[static constexpr] bool QAtomicInteger::isFetchAndAddWaitFree()

アトミック・フェッチ・アンド・アッドが待ちなしの場合はtrue を返し、そうでない場合は false を返す。

[static constexpr] bool QAtomicInteger::isFetchAndStoreNative()

フェッチ&ストアがアトミック・プロセッサ命令で実装されている場合はtrue を返し、そうでない場合は false を返す。

[static constexpr] bool QAtomicInteger::isFetchAndStoreWaitFree()

アトミック・フェッチ&ストアが待ちなしの場合はtrue を返し、そうでない場合は false を返す。

[static constexpr] bool QAtomicInteger::isReferenceCountingNative()

参照カウントがアトミック・プロセッサ命令を使用して実装されている場合はtrue を返し、そうでない場合は false を返す。

[static constexpr] bool QAtomicInteger::isReferenceCountingWaitFree()

アトミック参照カウントが待ちなしの場合はtrue を返し、そうでない場合は false を返す。

[static constexpr] bool QAtomicInteger::isTestAndSetNative()

test-and-setがアトミック・プロセッサ命令を使って実装されていればtrue 、そうでなければfalseを返す。

[static constexpr] bool QAtomicInteger::isTestAndSetWaitFree()

アトミック・テスト・アンド・セットが待機なしの場合はtrue を返し、そうでない場合は false を返す。

T QAtomicInteger::loadAcquire() const

Acquire "メモリ順序を使用して、このQAtomicInteger の値をアトミックにロードする。値は一切変更されないが、変更されないという保証はないことに注意。

storeRelaxed() およびloadRelaxed()も参照

T QAtomicInteger::loadRelaxed() const

このQAtomicInteger の値を、緩和されたメモリ順序を用いてアトミックにロードする。値が変更されることはありませんが、変更されないという保証はないことに注意してください。

storeRelaxed() およびloadAcquire()も参照

bool QAtomicInteger::ref()

このQAtomicInteger の値をアトミックにインクリメントする。新しい値が 0 でない場合はtrue を返し、そうでない場合は false を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリアクセスが再順序付けされないことを保証する。

deref() およびoperator++()も参照のこと

void QAtomicInteger::storeRelaxed(T newValue)

緩和されたメモリ順序を使用して、newValue の値をこのアトミック型にアトミックに格納する。

storeRelease() およびloadRelaxed()も参照のこと

void QAtomicInteger::storeRelease(T newValue)

Release "メモリ順序を使用して、newValue 値をこのアトミック型にアトミックに格納する。

storeRelaxed() およびloadAcquire()も参照のこと

bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue)

アトミック・テスト・アンド・セット。

注意: ループ内でこの関数を使用する場合は、T &currentValue 引数を追加したオーバーロードを使用することを検討する。

このQAtomicInteger の現在の値がexpectedValue の場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返します。値が同じでない場合、この関数は何もせず、false を返す。

この関数は、acquire memory ordering セマンティクスを使用し、アトミック操作の後に続くメモリ・アクセス(プ ログラム順)が、アトミック操作の前に再順序付けされないことを保証する。

bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue, T &currentValue)

アトミックなテスト・アンド・セット。

このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返す。値が同じでない場合、関数はこのQAtomicInteger の現在値をcurrentValue にロードし、false を返す。

この関数は、acquire memory ordering セマンティクスを使用し、アトミック操作の後に続くメモリ・アクセス(プ ログラム順)が、アトミック操作の前に再順序付けされないようにします。

bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue)

アトミック・テスト・アンド・セット。

注意: ループ内でこの関数を使用する場合は、T &currentValue 引数を追加したオーバーロードを使用することを検討する。

このQAtomicInteger の現在の値がexpectedValue の場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返します。値が同じでない場合、この関数は何もせず、false を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリ・アクセスが再順序付けされないことを保証する。

bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue, T &currentValue)

アトミックなテスト・アンド・セット。

このQAtomicInteger の現在値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返す。値が同じでない場合、このQAtomicInteger の現在値をcurrentValue にロードし、false を返す。

この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリ・アクセスが再順序付けされないようにします。

bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue)

アトミック・テスト・アンド・セット。

注意: ループ内でこの関数を使用する場合は、T &currentValue 引数を追加したオーバーロードを使用することを検討する。

このQAtomicInteger の現在の値がexpectedValue の場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返します。値が同じでない場合、この関数は何もせず、false を返す。

この関数は、memory ordering のセマンティクスを緩和し、コンパイラとプロセッサが自由にメモリ・アクセスの順序を変更できるようにしています。

bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue, T &currentValue)

アトミックなテスト・アンド・セット。

このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返す。値が同じでない場合、関数はこのQAtomicInteger の現在値をcurrentValue にロードし、false を返す。

この関数は、memory ordering のセマンティクスを緩和しているため、コンパイラとプロセッサは自由にメモリ・アクセスの順序を変更することができます。

bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue)

アトミック・テスト・アンド・セット。

注意: ループ内でこの関数を使用する場合は、T &currentValue 引数を追加したオーバーロードを使用することを検討する。

このQAtomicInteger の現在の値がexpectedValue の場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返します。値が同じでない場合、この関数は何もせず、false を返す。

この関数はリリース memory ordering セマンティクスを使用し、アトミック操作前のメモリ・アクセス(プログラム順)がアトミック操作後に再順序付けされないことを保証する。

bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue, T &currentValue)

アトミックなテスト・アンド・セット。

このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返す。値が同じでない場合、関数はこのQAtomicInteger の現在値をcurrentValue にロードし、false を返す。

この関数はリリース memory ordering セマンティクスを使用し、アトミック操作の前(プログラム順)のメモリ・アクセスが、アトミック操作の後に再順序付けされないことを保証します。

T QAtomicInteger::operator T() const

このQAtomicInteger の値を、可能であれば連続的に一貫性のあるメモリ順序で、不可能であれば "Acquire "順序で、アトミックにロードする。値が変更されることはありませんが、変更されないという保証はないことに注意してください。

loadRelaxed() およびloadAcquire()も参照の こと。

T QAtomicInteger::operator&=(T value)

アトミックadd-and-fetch。

このQAtomicInteger の現在値を読み込み、value を現在値にビットANDし、新しい値を返す。

この関数は、可能であれば一貫したメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

fetchAndAndOrdered()も参照のこと

T QAtomicInteger::operator++()

このQAtomicInteger の値をアトミックにプリインクリメントします。このアトミックの新しい値を返す。

この関数は、可能であれば一貫性のあるメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

ref()、operator++(int)、operator--()も参照のこと

T QAtomicInteger::operator++(int)

このQAtomicInteger の値をアトミックにポストインクリメントします。このアトミックの古い値を返す。

この関数は、可能であれば一貫したメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

ref()、operator++()、operator--(int)も参照のこと

T QAtomicInteger::operator+=(T value)

アトミック・アド・アンド・フェッチ。

このQAtomicInteger の現在値を読み取り、次に現在値にvalue を加算し、新しい値を返す。

この関数は、可能であれば一貫したメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

fetchAndAddOrdered() およびoperator-=()も参照のこと

T QAtomicInteger::operator--()

このQAtomicInteger の値をアトミックに事前デクリメントします。このアトミックの新しい値を返す。

この関数は、可能であれば一貫したメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

deref()、operator--(int)、operator++()も参照のこと

T QAtomicInteger::operator--(int)

アトミックにこのQAtomicInteger の値をポストデクリメントする。このアトミックの古い値を返す。

この関数は、可能であれば一貫したメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

deref()、operator--()、operator++(int)も参照のこと

T QAtomicInteger::operator-=(T value)

原子サブ・アンド・フェッチ。

このQAtomicInteger の現在値を読み込み、value を現在値に減算して新しい値を返す。

この関数は、可能であれば一貫性のあるメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

fetchAndSubOrdered() およびoperator+=()も参照の こと。

QAtomicInteger<T> &QAtomicInteger::operator=(T)

可能であれば、連続的に一貫性のあるメモリ順序で、そうでなければ "Release "順序で、もう一方の値をこのアトミック型にアトミックに格納する。この関数は、このオブジェクトへの参照を返す。

storeRelaxed() およびstoreRelease()も参照

[noexcept] QAtomicInteger<T> &QAtomicInteger::operator=(const QAtomicInteger<T> &other)

other をこのQAtomicInteger に割り当て、このQAtomicInteger への参照を返す。

T QAtomicInteger::operator^=(T value)

アトミックxor-and-fetch。

このQAtomicInteger の現在値を読み込み、value を現在値にビット単位でXORし、新しい値を返す。

この関数は、可能であれば一貫したメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

fetchAndXorOrdered()も参照のこと

T QAtomicInteger::operator|=(T value)

アトミック・オア・アンド・フェッチ。

このQAtomicInteger の現在値を読み込み、value を現在値にビット単位でORし、新しい値を返す。

この関数は、可能であれば一貫したメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。

fetchAndOrOrdered()も参照のこと

関連する非会員

[noexcept, since 6.7] void qYieldCpu()

このスレッドのスケジューリングを解除することなく、ハードウェア命令を使用して、現在のスレッドの実行を指定された時間だけ一時停止する。この関数は、他のスレッドがアトミック変数を変更することをコードが期待するような、高スループットのループで使用されることを意図している。これは、スレッド全体をCPUから外し、他のスレッド(他のプロセスに属する可能性がある)を実行できるようにするOSレベルの操作であるQThread::yieldCurrentThread ()とはまったく異なる。

そのため

while (!condition)
    ;

の代わりに

while (!condition)
    qYieldCpu();

これは、同じコア上でハードウェア・マルチスレッドを使用する場合と使用しない場合の両方で有用である。ハードウェアスレッドの場合、投機的実行がパイプラインを埋め尽くして、兄弟スレッドのリソースが枯渇するのを防ぐことができる。コアとより高い分離レベルでは、キャッシュ・コヒーレンシ・プロトコルが、変更され検査されるキャッシュ・ラインを、このコードが結果を期待している論理プロセッサに割り当てることができます。

また、グローバル変数を変更しないコードのまわりをループすることで、メモリ位置を排他的に取得する際の競合を避けることが推奨される。そのため、スピンロック取得のようなアトミックな変更ループが必要です:

while (true) {
    while (!readOnlyCondition(atomic))
        qYieldCpu();
    if (modify(atomic))
        break;
}

x86 プロセッサおよびZihintpause 拡張を持つ RISC-V プロセッサでは、PAUSE 命令が発行されます。これは、これをサポートしていないプロセッサでは無視されます。ARMv7 以降の ARM プロセッサでは、YIELD 命令が発行されます。

この関数は Qt 6.7 で導入されました。

マクロのドキュメント

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE

このマクロは、プロセッサが整数のアトミック・フェッチ&アドをサポートしている場合にのみ定義される。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE

このマクロは、ハードウェアが整数のアトミック・フェッチ&アドをサポートしていない場合に定義される。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_SOMETIMES_NATIVE

このマクロは、ある世代のプロセッサだけが整数のアトミック・フェッチ&アドをサポートしている場合に定義される。QAtomicInteger<T>::isFetchAndAddNative()関数を使用して、プロセッサが何をサポートしているかを確認する。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE

このマクロは、Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE とともに定義され、整数のアトミックフェッチアンドアドが待ちなしであることを示す。

nnは整数のサイズであり、ビット数 (8, 16, 32, 64) である。

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE

このマクロは、プロセッサが整数のアトミック・フェッチ&ストアをサポートしている場合にのみ定義される。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_NOT_NATIVE

このマクロは、ハードウェアが整数のアトミック・フェッチ&ストアをサポートしていない場合に定義される。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_SOMETIMES_NATIVE

このマクロは、ある世代のプロセッサのみが整数のアトミック・フェッチ&ストアをサポートしている場合に定義される。QAtomicInteger<T>::isFetchAndStoreNative()関数を使用して、プロセッサが何をサポートしているかを確認する。

nnは整数のサイズをビット数で表します(8、16、32、64)。

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_WAIT_FREE

このマクロは、Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE とともに定義され、整数に対するアトミックなフェッチ&ストアがウェイトフリーであることを示す。

nnは整数のサイズであり、ビット数 (8, 16, 32, 64) である。

Q_ATOMIC_INTnn_IS_SUPPORTED

このマクロは、コンパイラとアーキテクチャの組み合わせで、サイズnn(ビット)のアトミック整数がサポートされている場合に定義される。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

以下のマクロが常に定義されている:

  • q_atomic_int8_is_supported
  • q_atomic_int16_is_supported
  • q_atomic_int32_is_supported

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE

このマクロは、ご使用のプロセッサの全世代がアトミック参照カウントをサポートしている場合にのみ定義されます。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_NOT_NATIVE

このマクロは、ハードウェアがアトミック参照カウントをサポートしていない場合に定義される。

nnは整数のサイズで、単位はビット(8、16、32、64)。

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE

このマクロは、プロセッサの特定の世代のみがアトミック参照カウントをサポートしている場合に定義される。QAtomicInteger<T>::isReferenceCountingNative()関数を使用して、プロセッサが何をサポートしているかを確認する。

nnは整数のサイズで、ビット数 (8、16、32、64) です。

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_WAIT_FREE

このマクロは、Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE とともに定義され、参照カウントがウェイトフリーであることを示す。

nnは整数のサイズで、単位はビット(8、16、32、64)。

Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE

このマクロは、プロセッサが整数のアトミック・テスト&セットをサポートしている場合にのみ定義される。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_TEST_AND_SET_IS_NOT_NATIVE

このマクロは、ハードウェアが整数のアトミックテストアンドセットをサポートしていない場合に定義される。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_TEST_AND_SET_IS_SOMETIMES_NATIVE

このマクロは、ある世代のプロセッサのみが整数のアトミックテストアンドセットをサポートしている場合に定義される。QAtomicInteger<T>::isTestAndSetNative()関数を使用して、プロセッサが何をサポートしているかを確認する。

nnは整数のサイズであり、単位はビット(8、16、32、64)である。

Q_ATOMIC_INTnn_TEST_AND_SET_IS_WAIT_FREE

このマクロはQ_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE とともに定義され、整数のアトミックテストアンドセットが待ちなしであることを示す。

nnは整数のサイズであり、ビット数 (8, 16, 32, 64) である。

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