QAtomicPointer Class
template <typename T> class QAtomicPointerQAtomicPointer クラスは、ポインタに対してプラットフォームに依存しないアトミック操作を提供するテンプレートクラスです。詳細...
| ヘッダー: | #include <QAtomicPointer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 継承されたメンバーを含むすべてのメンバーの一覧
- QAtomicPointer は、スレッド処理クラス群の一部です。
パブリック関数
| QAtomicPointer(T *value = nullptr) | |
| QAtomicPointer(const QAtomicPointer<T> &other) | |
| T * | fetchAndAddAcquire(qptrdiff valueToAdd) |
| T * | fetchAndAddOrdered(qptrdiff valueToAdd) |
| T * | fetchAndAddRelaxed(qptrdiff valueToAdd) |
| T * | fetchAndAddRelease(qptrdiff valueToAdd) |
| T * | fetchAndStoreAcquire(T *newValue) |
| T * | fetchAndStoreOrdered(T *newValue) |
| T * | fetchAndStoreRelaxed(T *newValue) |
| T * | fetchAndStoreRelease(T *newValue) |
| T * | loadAcquire() const |
| T * | loadRelaxed() const |
| 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) |
| QAtomicPointer<T> & | operator=(const QAtomicPointer<T> &other) |
静的パブリックメンバー
| bool | isFetchAndAddNative() |
| bool | isFetchAndAddWaitFree() |
| bool | isFetchAndStoreNative() |
| bool | isFetchAndStoreWaitFree() |
| bool | isTestAndSetNative() |
| bool | isTestAndSetWaitFree() |
マクロ
詳細な説明
整数に対するアトミック操作については、QAtomicInteger クラスを参照してください。
アトミック操作とは、中断されることなく完了する複雑な操作のことです。QAtomicPointer クラスは、ポインタに対するアトミックな test-and-set、fetch-and-store、および fetch-and-add を提供します。テンプレートパラメータT は、ポインタが指す型を指定します。
Atomic API
メモリ順序
QAtomicPointerは、アトミックなテスト・アンド・セット、フェッチ・アンド・ストア、およびフェッチ・アンド・アドの関数について、いくつかの実装を提供しています。 各実装は、アトミック命令を囲むメモリアクセスがプロセッサによってどのように実行されるかを記述するメモリ順序のセマンティクスを定義しています。多くの最新アーキテクチャではアウト・オブ・オーダー実行やメモリ順序が許容されているため、アプリケーションがすべてのプロセッサで正しく動作することを保証するには、適切なセマンティクスを使用する必要があります。
- Relaxed - メモリ順序は未指定であり、コンパイラとプロセッサがメモリアクセスを自由に再順序化します。
- Acquire - 原子操作に続く(プログラム順の)メモリアクセスは、原子操作の前に再順序付けされない。
- Release - アトミック操作の前に行われる(プログラム順序上の)メモリアクセスは、アトミック操作の後に再順序付けされてはならない。
- Ordered - 「Acquire」と「Release」のセマンティクスを組み合わせたものです。
テスト・アンド・セット
QAtomicPointer の現在の値が期待値である場合、test-and-set 関数は QAtomicPointer に新しい値を代入し、true を返します。値が一致しない場合、これらの関数は何もしないで false を返します。この操作は、以下のコードに相当します:
if (currentValue == expectedValue) {
currentValue = newValue;
return true;
}
return false;test-and-set 関数は 4 つあります:testAndSetRelaxed()、testAndSetAcquire()、testAndSetRelease()、およびtestAndSetOrdered()。さまざまなメモリ順序セマンティクスに関する説明については、上記を参照してください。
フェッチ・アンド・ストア
アトミックなフェッチ・アンド・ストア関数は、QAtomicPointerの現在の値を読み取り、新しい値を代入した後、元の値を返します。この操作は、以下のコードに相当します:
T *originalValue = currentValue;
currentValue = newValue;
return originalValue;フェッチ・アンド・ストア関数は、fetchAndStoreRelaxed()、fetchAndStoreAcquire()、fetchAndStoreRelease()、およびfetchAndStoreOrdered() の4つがあります。異なるメモリ順序のセマンティクスに関する説明については、上記を参照してください。
フェッチ・アンド・アド
アトミックなフェッチ・アンド・アド関数は、QAtomicPointerの現在の値を読み取り、指定された値を現在の値に加算して、元の値を返します。この操作は、以下のコードに相当します:
T *originalValue = currentValue;
currentValue += valueToAdd;
return originalValue;フェッチ・アンド・アド関数は4つあります:fetchAndAddRelaxed()、fetchAndAddAcquire()、fetchAndAddRelease()、およびfetchAndAddOrdered()。異なるメモリ順序のセマンティクスに関する説明については、上記を参照してください。
アトミックAPIの機能テスト
すべてのプロセッサで動作するプラットフォーム非依存のアトミック API を提供することは困難です。QAtomicPointer が提供する API は、すべてのプロセッサでアトミックに動作することが保証されています。しかし、すべてのプロセッサが QAtomicPointer が提供するすべての操作をサポートしているわけではないため、プロセッサに関する情報を公開する必要があります。
さまざまなマクロを使用することで、コンパイル時にハードウェアでどの機能がサポートされているかを確認できます。これらにより、特定の操作がハードウェアで常にサポートされているか、場合によってはサポートされるか、あるいはサポートされていないかがわかります。マクロの形式はQ_ATOMIC_POINTER_OPERATION_IS_HOW_NATIVE です。OPERATION は`TEST_AND_SET`、`FETCH_AND_STORE`、または `FETCH_AND_ADD` のいずれかであり、HOW は`ALWAYS`、`SOMETIMES`、または `NOT` のいずれかです。各操作に対して定義されるマクロは常に1つだけです。例えば、Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE が定義されている場合、Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE もQ_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE も定義されません。
定数時間で完了する操作は、ウェイトフリーであると言われます。このような操作は、いかなる種類のロックやループも使用せずに実装されます。 常にサポートされ、かつウェイトフリーであるアトミック操作に対して、Qt はQ_ATOMIC_POINTER_OPERATION_IS_ALWAYS_NATIVE に加えて、Q_ATOMIC_POINTER_OPERATION_IS_WAIT_FREE を定義しています。
アトミック操作が新しい世代のプロセッサでのみサポートされている場合、QAtomicPointer では、isTestAndSetNative()、isFetchAndStoreNative()、およびisFetchAndAddNative() 関数を使用して、実行時にハードウェアが何をサポートしているかを確認する方法も提供しています。ウェイトフリーの実装は、isTestAndSetWaitFree()、isFetchAndStoreWaitFree()、およびisFetchAndAddWaitFree() 関数を使用して検出できます。
以下は、QAtomicPointer のすべての機能マクロの完全なリストです:
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_WAIT_FREE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_WAIT_FREE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_WAIT_FREE
QAtomicInteger およびqYieldCpu()も参照してください 。
メンバ関数のドキュメント
[constexpr noexcept] QAtomicPointer::QAtomicPointer(T *value = nullptr)
指定されたvalue を使用して、QAtomicPointerを構築します。
[noexcept] QAtomicPointer::QAtomicPointer(const QAtomicPointer<T> &other)
other のコピーを作成します。
T *QAtomicPointer::fetchAndAddAcquire(qptrdiff valueToAdd)
アトミックなフェッチ・アンド・アド。
このQAtomicPointer の現在の値を読み取り、valueToAdd を現在の値に加算した後、元の値を返します。
この関数は、`acquire memory ordering ` セマンティクスを使用しており、これにより、アトミック操作に続く(プログラム順序での)メモリアクセスが、アトミック操作の前に再順序付けされることがないことが保証されます。
T *QAtomicPointer::fetchAndAddOrdered(qptrdiff valueToAdd)
アトミックなフェッチ・アンド・アド。
このQAtomicPointer の現在の値を読み取り、valueToAdd をその値に加算して、元の値を返します。
この関数は、順序付き memory ordering のセマンティクスを使用しており、これにより、アトミック操作の前後(プログラムの順序において)のメモリアクセスが再順序付けされないことが保証されます。
T *QAtomicPointer::fetchAndAddRelaxed(qptrdiff valueToAdd)
アトミックなフェッチ・アンド・アド。
このQAtomicPointer の現在の値を読み取り、valueToAdd をその値に加算して、元の値を返します。
この関数は、memory ordering の「relaxed」セマンティクスを採用しており、メモリアクセスの順序はコンパイラおよびプロセッサの裁量に委ねられています。
T *QAtomicPointer::fetchAndAddRelease(qptrdiff valueToAdd)
アトミックなフェッチ・アンド・アド。
このQAtomicPointer の現在の値を読み取り、valueToAdd をその値に加算して、元の値を返します。
この関数は、memory ordering の「リリース」セマンティクスを使用します。これにより、(プログラムの順序において)アトミック操作の前に実行されたメモリアクセスが、アトミック操作の後に再順序付けされることがないことが保証されます。
T *QAtomicPointer::fetchAndStoreAcquire(T *newValue)
アトミックなフェッチ・アンド・ストア。
このQAtomicPointer の現在の値を読み取り、newValue を代入した後、元の値を返します。
この関数は、memory ordering の「acquire」セマンティクスを使用します。これにより、(プログラム順序において)アトミック操作に続くメモリアクセスが、アトミック操作の前に再順序化されることがないことが保証されます。
T *QAtomicPointer::fetchAndStoreOrdered(T *newValue)
アトミックなフェッチ・アンド・ストア。
このQAtomicPointer の現在の値を読み取り、newValue を代入した後、元の値を返します。
この関数は、順序付き memory ordering のセマンティクスを使用しており、これにより、アトミック操作の前後(プログラム順)のメモリアクセスが再順序付けされないことが保証されます。
T *QAtomicPointer::fetchAndStoreRelaxed(T *newValue)
アトミックなフェッチ・アンド・ストア。
このQAtomicPointer の現在の値を読み取り、newValue を代入した後、元の値を返します。
この関数は、memory ordering の「relaxed」セマンティクスを使用しており、メモリアクセスの順序はコンパイラおよびプロセッサに委ねられています。
T *QAtomicPointer::fetchAndStoreRelease(T *newValue)
アトミックなフェッチ・アンド・ストア。
このQAtomicPointer の現在の値を読み取り、newValue を代入した後、元の値を返します。
この関数は、リリース型 memory ordering セマンティクスを使用しており、これにより、(プログラムの順序において)アトミック操作の前に実行されたメモリアクセスが、アトミック操作後に再順序化されることがないことが保証されます。
[static constexpr] bool QAtomicPointer::isFetchAndAddNative()
`fetch-and-add` がアトミックなプロセッサ命令を使用して実装されている場合は `true ` を返し、そうでない場合は `false` を返す。
[static constexpr] bool QAtomicPointer::isFetchAndAddWaitFree()
アトミックなフェッチ・アンド・アッドがウェイトフリーである場合は `true ` を返し、そうでない場合は `false` を返す。
[static constexpr] bool QAtomicPointer::isFetchAndStoreNative()
`fetch-and-store` がアトミックなプロセッサ命令を使用して実装されている場合は `true ` を返し、そうでない場合は `false` を返します。
[static constexpr] bool QAtomicPointer::isFetchAndStoreWaitFree()
アトミックなフェッチ・アンド・ストアがウェイトフリーである場合は `true ` を返し、そうでない場合は `false` を返す。
[static constexpr] bool QAtomicPointer::isTestAndSetNative()
test-and-set がアトミックなプロセッサ命令を使用して実装されている場合は `true ` を返し、そうでない場合は `false` を返します。
[static constexpr] bool QAtomicPointer::isTestAndSetWaitFree()
アトミックなテスト・アンド・セットがウェイトフリーである場合は `true ` を返し、そうでない場合は false を返す。
T *QAtomicPointer::loadAcquire() const
「Acquire」メモリ順序を使用して、このQAtomicPointer の値をアトミックに読み込みます。値は一切変更されませんが、その状態が維持される保証はないことに注意してください。
storeRelease() およびloadRelaxed()も参照してください 。
T *QAtomicPointer::loadRelaxed() const
このQAtomicPointer の値を、リラックスされたメモリ順序を使用してアトミックに読み込みます。値は一切変更されませんが、その状態が維持される保証はないことに注意してください。
storeRelaxed() およびloadAcquire()も参照してください 。
void QAtomicPointer::storeRelaxed(T *newValue)
newValue の値を、リラックスされたメモリ順序を使用して、このアトミック型にアトミックに格納します。
storeRelease() およびloadRelaxed()も参照してください 。
void QAtomicPointer::storeRelease(T *newValue)
「Release」メモリ順序を使用して、newValue の値をこのアトミック型にアトミックに格納します。
storeRelaxed() およびloadRelaxed()も参照してください 。
bool QAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue)
アトミックなtest-and-set。
注: この関数をループ内で使用する場合は 、代わりに追加のT *¤tValue 引数を持つオーバーロード版の使用を検討してください。これにより、失敗時の余分なload()呼び出しを回避できます。
この `QAtomicPointer ` の現在の値が `expectedValue` である場合、test-and-set 関数は `newValue ` をこの `QAtomicPointer ` に代入し、`true` を返します。値が同じでない場合、この関数は何も行わず、`false` を返します。
この関数は、memory ordering のセマンティクスを使用しており、これにより、アトミック操作に続く(プログラム順での)メモリアクセスが、アトミック操作の前に再順序付けされることがないことが保証されます。
bool QAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue, T *¤tValue)
アトミックなtest-and-set。
このQAtomicPointer の現在の値がexpectedValue である場合、test-and-set関数はnewValue をこのQAtomicPointer に代入し、true を返します。値が同じでない場合、関数はこのQAtomicPointer の現在の値をcurrentValue に読み込み、false を返します。
この関数は、memory ordering のセマンティクスを使用します。これにより、(プログラムの順序において)アトミック操作に続くメモリアクセスが、アトミック操作の前に再順序付けされることがないことが保証されます。test-and-set が失敗した場合、currentValue にはmemory ordering のセマンティクスで値が読み込まれます。
bool QAtomicPointer::testAndSetOrdered(T *expectedValue, T *newValue)
アトミックなtest-and-set。
注: この関数をループ内で使用する場合は 、代わりに追加の引数 `T *¤tValue ` を持つオーバーロード版の使用を検討してください。これにより、失敗時の余分な `load()` を回避できます。
この `QAtomicPointer ` の現在の値が `expectedValue` である場合、テスト・アンド・セット関数は `newValue ` をこの `QAtomicPointer ` に代入し、`true` を返します。値が同じでない場合、この関数は何もしないで `false` を返します。
この関数は、順序付き memory ordering セマンティクスを使用しており、これにより、アトミック操作の前後(プログラム順)のメモリアクセスが再順序付けされないことが保証されます。
bool QAtomicPointer::testAndSetOrdered(T *expectedValue, T *newValue, T *¤tValue)
アトミックなテスト・アンド・セット。
このQAtomicPointer の現在の値がexpectedValue である場合、test-and-set関数は、このQAtomicPointer にnewValue を代入し、true を返します。値が同一でない場合、関数はこのQAtomicPointer の現在の値をcurrentValue に読み込み、false を返します。
この関数は、順序付き memory ordering セマンティクスを使用します。これにより、(プログラム順序における)アトミック操作の前後でのメモリアクセスが再順序化されないことが保証されます。test-and-setが失敗した場合、currentValue には、memory ordering セマンティクスによる取得が行われます。
bool QAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue)
アトミックなtest-and-set。
注: この関数をループ内で使用する場合は 、代わりに追加の引数T *¤tValue を持つオーバーロード版の使用を検討してください。これにより、失敗時の余分なload()の呼び出しを回避できます。
このQAtomicPointer の現在の値がexpectedValue である場合、test-and-set関数はnewValue をこのQAtomicPointer に代入し、trueを返します。値が同じでない場合、この関数は何も行わず、false を返します。
この関数は、memory ordering の緩和されたセマンティクスを採用しており、メモリアクセスの順序はコンパイラおよびプロセッサに自由に再配置される。
bool QAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue, T *¤tValue)
アトミックなテスト・アンド・セット。
このQAtomicPointer の現在の値がexpectedValue である場合、test-and-set関数はnewValue をこのQAtomicPointer に代入し、true を返します。値が同じでない場合、関数はこのQAtomicPointer の現在の値をcurrentValue に読み込み、false を返します。
この関数は、relaxed memory ordering セマンティクスを使用しており、メモリアクセスの順序付けはコンパイラおよびプロセッサに委ねられます。test-and-set が失敗した場合、currentValue にはrelaxed memory ordering セマンティクスに基づいて値が読み込まれます。
bool QAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue)
アトミックなテスト・アンド・セット。
注: この関数をループ内で使用する場合は 、代わりに追加のT *¤tValue 引数を持つオーバーロード版の使用を検討してください。これにより、失敗時の余分なload()の呼び出しを回避できます。
このQAtomicPointer の現在の値がexpectedValue である場合、test-and-set関数はnewValue をこのQAtomicPointer に代入し、trueを返します。値が同じでない場合、この関数は何もしないでfalse を返します。
この関数は、memory ordering のセマンティクスを使用しており、これにより、(プログラム順序において)アトミック操作の前に実行されたメモリアクセスが、アトミック操作後に再順序付けされることがないことが保証されます。
bool QAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue, T *¤tValue)
アトミックなテスト・アンド・セット。
このQAtomicPointer の現在の値がexpectedValue である場合、test-and-set関数はnewValue をこのQAtomicPointer に代入し、true を返します。値が同一でない場合、関数はこのQAtomicPointer の現在の値をcurrentValue に読み込み、false を返します。
この関数は、memory ordering のセマンティクスを使用します。これにより、(プログラムの順序において)アトミック操作の前に実行されたメモリアクセスが、アトミック操作後に再順序付けされることがないことが保証されます。test-and-setが失敗した場合、currentValue には、relaxed memory ordering のセマンティクスに従って値が読み込まれます。
[noexcept] QAtomicPointer<T> &QAtomicPointer::operator=(const QAtomicPointer<T> &other)
other をこのQAtomicPointer に割り当て、このQAtomicPointer への参照を返します。
マクロのドキュメント
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
このマクロは、お使いのプロセッサがポインタに対するアトミックなフェッチ・アンド・アドをサポートしている場合にのみ定義されます。
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
このマクロは、ハードウェアがポインタに対するアトミックなフェッチ・アンド・アドをサポートしていない場合に定義されます。
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
このマクロは、プロセッサの特定の世代のみがポインタに対するアトミックなフェッチ・アンド・アドをサポートしている場合に定義されます。お使いのプロセッサが何をサポートしているかを確認するには、QAtomicPointer::isFetchAndAddNative() 関数を使用してください。
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_WAIT_FREE
このマクロは、Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE と共に定義されており、ポインタに対するアトミックなフェッチ・アンド・アド操作がウェイトフリーであることを示すものです。
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
このマクロは、お使いのプロセッサがポインタに対するアトミックなフェッチ・アンド・ストアをサポートしている場合にのみ定義されます。
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
このマクロは、ハードウェアがポインタに対するアトミックなフェッチ・アンド・ストアをサポートしていない場合に定義されます。
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
このマクロは、プロセッサの特定の世代のみがポインタに対するアトミックなフェッチ・アンド・ストアをサポートしている場合に定義されます。お使いのプロセッサが何をサポートしているかを確認するには、QAtomicPointer::isFetchAndStoreNative() 関数を使用してください。
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_WAIT_FREE
このマクロは、Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE と共に定義されており、ポインタに対するアトミックなフェッチ・アンド・ストアがウェイトフリーであることを示すものです。
Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
このマクロは、お使いのプロセッサがポインタに対するアトミックなテスト・アンド・セットをサポートしている場合にのみ定義されます。
Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
このマクロは、ハードウェアがポインタに対するアトミックなテスト・アンド・セットをサポートしていない場合に定義されます。
Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE
このマクロは、プロセッサの特定の世代のみがポインタに対するアトミックなテスト・アンド・セットをサポートしている場合に定義されます。お使いのプロセッサが何をサポートしているかを確認するには、QAtomicPointer::isTestAndSetNative() 関数を使用してください。
Q_ATOMIC_POINTER_TEST_AND_SET_IS_WAIT_FREE
このマクロは、Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE と共に定義されており、ポインタに対するアトミックなテスト・アンド・セットがウェイトフリーであることを示すものです。
© 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.