QAtomicInteger Class
template <typename T> class QAtomicIntegerQAtomicInteger クラスは、プラットフォームに依存しない整数のアトミック演算を提供します。詳細...
Header: | #include <QAtomicInteger> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Inherited By: |
- 継承メンバを含む全メンバのリスト
- QAtomicInteger はスレッドクラスに属しています。
パブリック関数
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 ¤tValue) |
bool | testAndSetOrdered(T expectedValue, T newValue) |
bool | testAndSetOrdered(T expectedValue, T newValue, T ¤tValue) |
bool | testAndSetRelaxed(T expectedValue, T newValue) |
bool | testAndSetRelaxed(T expectedValue, T newValue, T ¤tValue) |
bool | testAndSetRelease(T expectedValue, T newValue) |
bool | testAndSetRelease(T expectedValue, T newValue, T ¤tValue) |
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) |
静的パブリックメンバ
bool | isFetchAndAddNative() |
bool | isFetchAndAddWaitFree() |
bool | isFetchAndStoreNative() |
bool | isFetchAndStoreWaitFree() |
bool | isReferenceCountingNative() |
bool | isReferenceCountingWaitFree() |
bool | isTestAndSetNative() |
bool | isTestAndSetWaitFree() |
関連非会員
(since 6.7) void | qYieldCpu() |
マクロ
詳細説明
ポインタに対するアトミック操作については、QAtomicPointer クラスを参照のこと。
アトミック操作は、中断することなく完了する複雑な操作です。QAtomicInteger クラスは、整数のアトミックな参照カウント、テスト・アンド・セット、フェッチ・アンド・ストア、フェッチ・アンド・アドを提供します。
テンプレート・パラメータ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は整数サイズ(ビット単位)、OPERATIONはREFERENCE_COUNTING 、TEST_AND_SET 、FETCH_AND_STORE 、FETCH_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し、元の値を返す。
この関数はリリース 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 に代入して、元の値を返す。
この関数はrelease 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)
アトミック・フェッチ・アンド・クソル。
このQAtomicInteger の現在値を読み取り、valueToXor を現在値にビット単位で XOR し、元の値を返す。
この関数は、acquire memory ordering セマンティクスを使用します。このセマンティクスは、アトミック操作(プログラム順)に続くメモリ・アクセスが、アトミック操作の前に再順序付けされないことを保証します。
operator^=()も参照のこと 。
T QAtomicInteger::fetchAndXorOrdered(T valueToXor)
アトミック・フェッチ・アンド・クソル。
このQAtomicInteger の現在値を読み取り、valueToXor を現在値にビット単位でXORし、元の値を返す。
この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリ・アクセスが再順序付けされないことを保証する。
operator^=()も参照のこと 。
T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)
アトミック・フェッチ・アンド・キソー。
このQAtomicInteger の現在値を読み取り、valueToXor を現在値にビット単位でXORし、元の値を返す。
この関数は、memory ordering のセマンティクスを緩和し、コンパイラとプロセッサが自由にメモリ・アクセスの順序を変更できるようにします。
operator^=()も参照のこと 。
T QAtomicInteger::fetchAndXorRelease(T valueToXor)
アトミック・フェッチ・アンド・キソー。
このQAtomicInteger の現在値を読み取り、valueToXor を現在値にビット単位でXORし、元の値を返す。
この関数は、memory ordering リリース・セマンティクスを使用します。このセマンティクスは、アトミック操作(プログラム順)前のメモリ・アクセスが、アトミック操作後に再順序付けされないことを保証します。
operator^=()も参照のこと 。
[static constexpr]
bool QAtomicInteger::isFetchAndAddNative()
フェッチ・アンド・アドがアトミック・プロセッサ命令を使用して実装されている場合は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()
アトミックプロセッサ命令を使用してテストアンドセットが実装されている場合は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 ¤tValue
引数を追加したオーバーロードを使用することを検討する。
このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返します。値が同じでない場合、この関数は何もせず、false
を返す。
この関数は、acquire memory ordering セマンティクスを使用します。このセマンティクスは、アトミック操作の後に続くメモリ・アクセス(プログラム順)が、アトミック操作の前に再順序付けされないことを保証します。
bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue, T ¤tValue)
アトミック・テスト・アンド・セット。
このQAtomicInteger の現在値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true
を返す。値が同じでない場合、関数はこのQAtomicInteger の現在値をcurrentValue にロードし、false
を返します。
この関数は、acquire memory ordering セマンティクスを使用し、アトミック操作の後に続くメモリ・アクセス(プ ログラム順)が、アトミック操作の前に再順序付けされないようにします。
bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue)
アトミック・テスト・アンド・セット。
注意: この関数をループ内で使用する場合は、T ¤tValue
引数を追加したオーバーロードを使用すると、失敗時の余計な load() を回避できます。
このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返します。値が同じでない場合、この関数は何もせず、false
を返す。
この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリ・アクセスが再順序付けされないことを保証します。
bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue, T ¤tValue)
アトミック・テスト・アンド・セット。
このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true
を返す。値が同じでない場合、このQAtomicInteger の現在値をcurrentValue にロードし、false
を返す。
この関数は順序付き memory ordering セマンティクスを使用し、アトミック操作の前後(プログラム順)のメモリ・アクセスが再順序付けされないことを保証する。
bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue)
アトミック・テスト・アンド・セット。
注意: ループ内でこの関数を使用する場合、代わりに追加引数T ¤tValue
を持つオーバーロードを使用することを検討することで、失敗時の余分なload()を回避できる。
このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返します。値が同じでない場合、この関数は何もせず、false
を返す。
この関数は、memory ordering のセマンティクスを緩和しているため、コンパイラとプロセッサは自由にメモリ・アクセスの順序を変更することができます。
bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue, T ¤tValue)
アトミック・テスト・アンド・セット。
このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true
を返します。値が同じでない場合、関数はこのQAtomicInteger の現在値をcurrentValue にロードし、false
を返します。
この関数は、memory ordering のセマンティクスを緩和しているため、コンパイラとプロセッサは自由にメモリ・アクセスの順序を変更することができます。
bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue)
アトミック・テスト・アンド・セット。
注意: この関数をループ内で使用する場合は、T ¤tValue
引数を追加したオーバーロードを使用することを検討してください。
このQAtomicInteger の現在の値がexpectedValue である場合、test-and-set 関数はnewValue をこのQAtomicInteger に代入し、true を返します。値が同じでない場合、この関数は何もせず、false
を返す。
この関数はrelease memory ordering セマンティクスを使用し、アトミック操作前のメモリ・アクセス(プ ログラムの順序)がアトミック操作後に再順序付けされないようにします。
bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue, T ¤tValue)
アトミック・テスト・アンド・セット。
この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 の値をプリインクリメントする。atomic の新しい値を返す。
この関数は、可能であれば一貫性のあるメモリ順序を使用し、そうでなければ "順序付き" 順序を使用する。
ref()、operator++(int)、operator--()も参照のこと 。
T QAtomicInteger::operator++(int)
アトミックにこのQAtomicInteger の値をポストインクリメントする。このアトミックの古い値を返す。
この関数は、可能であれば一貫性のあるメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。
ref()、operator++()、operator--(int)も参照のこと 。
T QAtomicInteger::operator+=(T value)
アトミックadd-and-fetch。
このQAtomicInteger の現在値を読み取り、value を現在値に加算して、新しい値を返す。
この関数は、可能であれば一貫性のあるメモリ順序を使用し、不可能であれば "Ordered "順序を使用する。
fetchAndAddOrdered() およびoperator-=()も参照のこと 。
T QAtomicInteger::operator--()
アトミックにこのQAtomicInteger の値を事前にデクリメントする。このアトミックの新しい値を返す。
この関数は、可能であれば連続的に一貫したメモリ順序を使用し、そうでなければ "順序付き" 順序を使用する。
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)
アトミックor-and-fetch。
この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)です。
本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。