このページでは

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)
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 クラスは、整数に対してアトミックな参照カウント、テスト・アンド・セット、フェッチ・アンド・ストア、およびフェッチ・アンド・アドを提供します。テンプレートパラメータT は、アトミック化される整数型を指定します。

テンプレートパラメータ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 ビット、およびポインタサイズのインスタンス化のみが、すべてのプラットフォームで動作することが保証されています。 その他のサイズのサポートは、コードがコンパイルされるコンパイラおよびプロセッサアーキテクチャによって異なります。32 ビットプラットフォームで 64 ビット型がサポートされているかどうかをテストするには、マクロQ_ATOMIC_INT64_IS_SUPPORTED を確認してください。

Atomic 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 を返します。値が一致しない場合、これらの関数は何も行わず、false を返します。この操作は、以下のコードに相当します:

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

test-and-set関数は4つあります: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;

フェッチ・アンド・アド関数は 4 つあります:fetchAndAddRelaxed()、fetchAndAddAcquire()、fetchAndAddRelease()、およびfetchAndAddOrdered() です。さまざまなメモリ順序のセマンティクスに関する説明については、上記を参照してください。

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

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

さまざまなマクロを使用することで、コンパイル時にハードウェアでどの機能がサポートされているかを確認できます。これらのマクロは、特定の操作に対してハードウェアが常にサポートしているか、場合によってはサポートしているか、あるいはサポートしていないかを示します。 マクロの形式はQ_ATOMIC_INTnn_OPERATION_IS_HOW_NATIVE です。nnは整数のサイズ(ビット単位)、OPERATIONはREFERENCE_COUNTING 、TEST_AND_SET 、FETCH_AND_STORE 、またはFETCH_AND_ADD のいずれか、HOW はALWAYS、SOMETIMES、または NOT のいずれかです。 各操作につき、定義されるマクロは常に1つだけとなります。例えば、Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVE が定義されている場合、 Q_ATOMIC_INT_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_フェッチ・アンド・ストアはネイティブではない
  • Q_ATOMIC_INTnn_フェッチ・アンド・ストアは待機不要
  • 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 の値をアトミックに減算します。新しい値がゼロ以外の場合は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 の「relaxed」セマンティクスを採用しており、メモリアクセスの順序はコンパイラとプロセッサに自由に再配置させることができます。

operator+=() およびfetchAndSubRelaxed()も参照してください 。

T QAtomicInteger::fetchAndAddRelease(T valueToAdd)

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

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

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

operator+=() およびfetchAndSubRelease()も参照してください 。

T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)

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

このQAtomicInteger の現在の値を読み取り、valueToAnd をその値とビット単位のAND演算を行い、元の値を返します。

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

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)

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

このQAtomicInteger の現在の値を読み取り、valueToOr をその値とビット単位のOR演算を行い、元の値を返します。

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

operator|=()も参照してください 。

T QAtomicInteger::fetchAndOrOrdered(T valueToOr)

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

このQAtomicInteger の現在の値を読み取り、valueToOr をその値とビット単位のOR演算を行い、元の値を返します。

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

operator|=()も参照してください 。

T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)

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

このQAtomicInteger の現在の値を読み取り、valueToOr を現在の値とビット単位のOR演算を行い、元の値を返します。

この関数は、memory ordering の「relaxed」セマンティクスを採用しており、メモリアクセスの順序はコンパイラおよびプロセッサに委ねられます。

operator|=()も参照してください 。

T QAtomicInteger::fetchAndOrRelease(T valueToOr)

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

このQAtomicInteger の現在の値を読み取り、valueToOr を現在の値とビット単位のOR演算を行い、元の値を返します。

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

operator|=()も参照してください 。

T QAtomicInteger::fetchAndStoreAcquire(T newValue)

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

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

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

T QAtomicInteger::fetchAndStoreOrdered(T newValue)

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

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

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

T QAtomicInteger::fetchAndStoreRelaxed(T newValue)

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

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

この関数は、memory ordering の「relaxed」セマンティクスを採用しており、メモリアクセスの順序はコンパイラおよびプロセッサに委ねられています。

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 を現在の値から差し引いて、元の値を返します。

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

operator-=() およびfetchAndAddRelease()も参照してください 。

T QAtomicInteger::fetchAndXorAcquire(T valueToXor)

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

このQAtomicInteger の現在の値を読み取り、valueToXor を現在の値とビット単位のXOR演算を行い、元の値を返します。

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

operator^=()も参照してください 。

T QAtomicInteger::fetchAndXorOrdered(T valueToXor)

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

このQAtomicInteger の現在の値を読み取り、valueToXor をその値とビット単位でXOR演算を行い、元の値を返します。

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

operator^=()も参照してください 。

T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)

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

このQAtomicInteger の現在の値を読み取り、valueToXor をその値とビット単位でXOR演算を行い、元の値を返します。

この関数は、memory ordering の「relaxed」セマンティクスを使用しており、メモリアクセスの順序はコンパイラおよびプロセッサの裁量に委ねられます。

operator^=()も参照してください 。

T QAtomicInteger::fetchAndXorRelease(T valueToXor)

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

このQAtomicInteger の現在の値を読み取り、valueToXor をその値とビット単位のXOR演算を行い、元の値を返します。

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

operator^=()も参照してください 。

[static constexpr] bool QAtomicInteger::isFetchAndAddNative()

`fetch-and-add` がアトミックなプロセッサ命令を使用して実装されている場合は `true ` を返し、そうでない場合は `false` を返します。

[static constexpr] bool QAtomicInteger::isFetchAndAddWaitFree()

アトミックなフェッチ・アンド・アッドがウェイトフリーである場合は `true ` を返し、そうでない場合は `false` を返す。

[static constexpr] bool QAtomicInteger::isFetchAndStoreNative()

`fetch-and-store` がアトミックなプロセッサ命令を使用して実装されている場合は `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 の値をアトミックにインクリメントします。新しい値がゼロ以外の場合は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)

アトミックなtest-and-set。

注: この関数をループ内で使用する場合は 、代わりに追加のT &currentValue 引数を持つオーバーロード版の使用を検討してください。これにより、失敗時のloadAcquire()の呼び出しが不要になります。

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

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

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

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

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

この関数は、memory ordering のセマンティクスを使用します。これにより、(プログラムの順序において)アトミック操作に続くメモリアクセスが、アトミック操作の前に再順序付けされることがないことが保証されます。test-and-setが失敗した場合、currentValue には、memory ordering のセマンティクスで値が読み込まれます。

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

アトミックなtest-and-set。

注: この関数をループ内で使用する場合は 、代わりに追加の引数T &currentValue を持つオーバーロード版の使用を検討してください。これにより、失敗時に余分なloadAcquire()が呼び出されるのを回避できます。

この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 セマンティクスを採用しています。これにより、(プログラム順序における)アトミック操作の前後でのメモリアクセスが再順序化されないことが保証されます。test-and-setが失敗した場合、currentValue には、memory ordering セマンティクスによる取得が行われます。

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

アトミックなtest-and-set。

注: この関数をループ内で使用する場合は 、代わりに追加のT &currentValue 引数を持つオーバーロード版の使用を検討してください。これにより、失敗時にloadRelaxed()が余分に行われるのを回避できます。

この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 を返します。

この関数は、relaxed memory ordering セマンティクスを使用しており、メモリアクセスの順序はコンパイラおよびプロセッサに委ねられます。test-and-set が失敗した場合、currentValue にはrelaxed memory ordering セマンティクスに基づいて値が読み込まれます。

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

アトミックなtest-and-set。

注: この関数をループ内で使用する場合は 、代わりに追加の引数T &currentValue を持つオーバーロード版の使用を検討してください。これにより、失敗時に余分なloadRelaxed()が実行されるのを回避できます。

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

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

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

アトミックなtest-and-set。

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

この関数は、memory ordering のセマンティクスを使用します。これにより、(プログラム順序において)アトミック操作の前に実行されたメモリアクセスが、アトミック操作後に再順序付けされることがないことが保証されます。test-and-setが失敗した場合、currentValue には、relaxed memory ordering のセマンティクスに従って値が読み込まれます。

QAtomicInteger::operator T() const

可能であれば、順次一貫性のあるメモリ順序を使用して、このQAtomicInteger の値をアトミックに読み込みます。それが不可能な場合は、「Acquire」順序を使用します。値は一切変更されませんが、その状態が維持される保証はないことに注意してください。

loadRelaxed() およびloadAcquire()も参照してください 。

T QAtomicInteger::operator&=(T value)

アトミックな加算・取得。

この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およびフェッチ。

このQAtomicInteger の現在の値を読み取り、value をその値とビット単位でXOR演算を行い、新しい値を返します。

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

fetchAndXorOrdered()も参照してください 。

T QAtomicInteger::operator|=(T value)

アトミックな「OR・AND・フェッチ」。

このQAtomicInteger の現在の値を読み取り、value をその値とビット単位のOR演算を行い、新しい値を返します。

この関数は、可能であれば逐次一貫性のあるメモリ順序を使用し、そうでない場合は「Ordered」順序を使用します。

fetchAndOrOrdered()も参照してください 。

関連する非メンバー関数

[noexcept, since 6.7] void qYieldCpu()

ハードウェア命令を使用して、現在のスレッドをスケジューリングから外すことなく、不特定の時間だけ実行を一時停止します。 この関数は、別のスレッドがアトミック変数を変更することを想定した、高スループットのループで使用することを目的としています。これは、QThread::yieldCurrentThread() とは全く異なります。 () は OS レベルの操作であり、スレッド全体を CPU から切り離し、他のスレッド(場合によっては他のプロセスに属するスレッド)の実行を許可する可能性があります。

したがって、

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::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::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::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::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 ビット)を表します。

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