Auf dieser Seite

QAtomicInteger Class

template <typename T> class QAtomicInteger

Die Klasse `QAtomicInteger` bietet plattformunabhängige atomare Operationen mit Ganzzahlen. Mehr...

Header: #include <QAtomicInteger>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Vererbt an:

QAtomicInt

Öffentliche Funktionen

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)

Statische öffentliche Mitglieder

(since 6.7) void qYieldCpu()

Makros

Ausführliche Beschreibung

Informationen zu atomaren Operationen mit Zeigern finden Sie in der Klasse „ QAtomicPointer “.

Eine atomare Operation ist eine komplexe Operation, die ohne Unterbrechung ausgeführt wird. Die Klasse `QAtomicInteger` bietet atomare Referenzzählung, „Test-and-Set“, „Fetch-and-Store“ und „Fetch-and-Add“ für Ganzzahlen. Der Template-Parameter ` T ` gibt den Ganzzahltyp an, der atomar gemacht werden soll.

Der Template-Parameter „ T “ muss ein C++-Ganzzahltyp sein:

  • 8-Bit: bool, char, signed char, unsigned char, qint8, quint8, char8_t (C++20)
  • 16-Bit: short, unsigned short, qint16, quint16, char16_t
  • 32-Bit: int, unsigned int, qint32, quint32, char32_t
  • 64-Bit: long long, unsigned long long, qint64, quint64
  • plattformspezifische Größe: long, unsigned long
  • Zeigergröße: qintptr, quintptr, qptrdiff

Von der obigen Liste funktionieren nur die Instanziierungen mit 8-Bit-, 16-Bit-, 32-Bit- und Zeigergröße garantiert auf allen Plattformen. Die Unterstützung anderer Größen hängt vom Compiler und der Prozessorarchitektur ab, für die der Code kompiliert wird. Um zu prüfen, ob die 64-Bit-Typen auf 32-Bit-Plattformen unterstützt werden, überprüfen Sie das Makro „ Q_ATOMIC_INT64_IS_SUPPORTED “.

Die Atomic-API

Referenzzählung

Die Funktionen ` ref()` und ` deref()` bieten eine effiziente API zur Referenzzählung. Der Rückgabewert dieser Funktionen gibt an, wann die letzte Referenz freigegeben wurde. Mit diesen Funktionen können Sie eigene implizit gemeinsam genutzte Klassen implementieren.

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;
}

Speicherreihenfolge

QAtomicInteger bietet mehrere Implementierungen der atomaren Funktionen „test-and-set“, „fetch-and-store“ und „fetch-and-add“. Jede Implementierung definiert eine Semantik der Speicherreihenfolge, die beschreibt, wie Speicherzugriffe rund um die atomare Anweisung vom Prozessor ausgeführt werden. Da viele moderne Architekturen eine außerreihenmäßige Ausführung und Speicherreihenfolge zulassen, ist die Verwendung der richtigen Semantik erforderlich, um sicherzustellen, dass Ihre Anwendung auf allen Prozessoren ordnungsgemäß funktioniert.

  • „Relaxed“ – Die Speicherreihenfolge ist nicht spezifiziert, sodass der Compiler und der Prozessor die Speicherzugriffe frei neu anordnen können.
  • „Acquire“ – Speicherzugriffe, die auf die atomare Operation folgen (in Programmreihenfolge), dürfen nicht vor die atomare Operation umgeordnet werden.
  • „Release“ – Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) dürfen nicht nach der atomaren Operation neu angeordnet werden.
  • „Ordered“ – eine Kombination der „Acquire“- und „Release“-Semantiken.

Test-and-Set

Wenn der aktuelle Wert des `QAtomicInteger` einem erwarteten Wert entspricht, weisen die „Test-and-Set“-Funktionen dem `QAtomicInteger` einen neuen Wert zu und geben „true“ zurück. Stimmen die Werte nicht überein, führen diese Funktionen keine Aktion aus und geben „false“ zurück. Diese Operation entspricht dem folgenden Code:

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

Es gibt vier „Test-and-Set“-Funktionen: ` testAndSetRelaxed()`, ` testAndSetAcquire()`, ` testAndSetRelease()` und ` testAndSetOrdered()`. Eine Erläuterung der verschiedenen Semantiken der Speicherreihenfolge finden Sie weiter oben.

Fetch-and-Store

Die atomaren „Fetch-and-Store“-Funktionen lesen den aktuellen Wert des `QAtomicInteger`, weisen ihm anschließend einen neuen Wert zu und geben den ursprünglichen Wert zurück. Diese Operation entspricht dem folgenden Code:

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

Es gibt 4 „Fetch-and-Store“-Funktionen: fetchAndStoreRelaxed(), fetchAndStoreAcquire(), fetchAndStoreRelease() und fetchAndStoreOrdered(). Eine Erläuterung der verschiedenen Semantiken der Speicherreihenfolge finden Sie weiter oben.

Fetch-and-Add

Die atomaren „Fetch-and-Add“-Funktionen lesen den aktuellen Wert des `QAtomicInteger`, addieren den angegebenen Wert zum aktuellen Wert hinzu und geben den ursprünglichen Wert zurück. Diese Operation entspricht dem folgenden Code:

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

Es gibt 4 „Fetch-and-Add“-Funktionen: fetchAndAddRelaxed(), fetchAndAddAcquire(), fetchAndAddRelease() und fetchAndAddOrdered(). Eine Erläuterung der verschiedenen Semantiken der Speicherreihenfolge finden Sie weiter oben.

Funktionstests für die Atomic-API

Die Bereitstellung einer plattformunabhängigen atomaren API, die auf allen Prozessoren funktioniert, ist eine Herausforderung. Die von QAtomicInteger bereitgestellte API funktioniert garantiert atomar auf allen Prozessoren. Da jedoch nicht alle Prozessoren Unterstützung für jede von QAtomicInteger bereitgestellte Operation implementieren, ist es notwendig, Informationen über den Prozessor bereitzustellen.

Mithilfe verschiedener Makros können Sie bereits zur Kompilierungszeit prüfen, welche Funktionen auf Ihrer Hardware unterstützt werden. Diese geben an, ob Ihre Hardware eine bestimmte Operation immer, manchmal oder gar nicht unterstützt. Die Makros haben die Form `Q_ATOMIC_INTnn_OPERATION_IS_HOW_NATIVE`. Dabei steht `nn` für die Größe der Ganzzahl (in Bit), `OPERATION ` ist einer der Werte ` REFERENCE_COUNTING`, ` TEST_AND_SET`, ` FETCH_AND_STORE` oder ` FETCH_AND_ADD`, und `HOW` ist einer der Werte `ALWAYS`, `SOMETIMES` oder `NOT`. Pro Operation ist immer genau ein Makro definiert. Wenn beispielsweise `Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVE` definiert ist, sind weder Q_ATOMIC_INT_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE noch Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_NOT_NATIVE definiert.

Eine Operation, die in konstanter Zeit abgeschlossen wird, wird als wartungsfrei bezeichnet. Solche Operationen werden nicht mithilfe von Sperren oder Schleifen jeglicher Art implementiert. Für atomare Operationen, die stets unterstützt werden und wartungsfrei sind, definiert Qt zusätzlich zuQ_ATOMIC_INTnn_OPERATION_IS_ALWAYS_NATIVE auchQ_ATOMIC_INTnn_OPERATION_IS_WAIT_FREE.

In Fällen, in denen eine atomare Operation nur in neueren Prozessorgenerationen unterstützt wird, bietet QAtomicInteger mit den Funktionen ` isReferenceCountingNative()`, ` isTestAndSetNative()`, ` isFetchAndStoreNative()` und ` isFetchAndAddNative()` auch eine Möglichkeit, zur Laufzeit zu prüfen, was Ihre Hardware unterstützt. Wartefreie Implementierungen können mit den Funktionen ` isReferenceCountingWaitFree()`, ` isTestAndSetWaitFree()`, ` isFetchAndStoreWaitFree()` und ` isFetchAndAddWaitFree()` erkannt werden.

Nachfolgend finden Sie eine vollständige Liste aller Feature-Makros für 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

Aus Gründen der Kompatibilität mit früheren Versionen von Qt entsprechen Makros mit einem leeren nn den 32-Bit-Makros. Beispielsweise entspricht Q_ATOMIC_INT_REFERENCE_COUNTING_IS_WAIT_FREE dem Makro Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_WAIT_FREE.

Siehe auch „ QAtomicPointer “.

Dokumentation zu Mitgliedsfunktionen

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

Erstellt ein `QAtomicInteger` mit dem angegebenen ` value`.

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

Erstellt eine Kopie von „ other “.

bool QAtomicInteger::deref()

Verringert den Wert dieses QAtomicInteger atomar. Gibt „ true “ zurück, wenn der neue Wert ungleich Null ist, andernfalls „false“.

Diese Funktion verwendet die Semantik „ memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu geordnet werden dürfen.

Siehe auch „ ref()“ und „ operator--()“.

T QAtomicInteger::fetchAndAddAcquire(T valueToAdd)

Atomares „Fetch-and-Add“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und addiert dann „ valueToAdd “ zum aktuellen Wert, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Acquire- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe, die (in Programmreihenfolge) auf die atomare Operation folgen, nicht vor der atomaren Operation neu geordnet werden dürfen.

Siehe auch „ operator+=()“ und „ fetchAndSubAcquire()“.

T QAtomicInteger::fetchAndAddOrdered(T valueToAdd)

Atomisches „Fetch-and-Add“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und addiert dann „ valueToAdd “ zum aktuellen Wert, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die Semantik „ordered memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu geordnet werden dürfen.

Siehe auch „ operator+=()“ und „ fetchAndSubOrdered()“.

T QAtomicInteger::fetchAndAddRelaxed(T valueToAdd)

Atomares „Fetch-and-Add“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und addiert dann „ valueToAdd “ zum aktuellen Wert, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „relaxed“ Semantik von ` memory ordering `, sodass der Compiler und der Prozessor die Speicherzugriffe frei neu anordnen können.

Siehe auch „ operator+=()“ und „ fetchAndSubRelaxed()“.

T QAtomicInteger::fetchAndAddRelease(T valueToAdd)

Atomares „Fetch-and-Add“.

Liest den aktuellen Wert dieses QAtomicInteger s und addiert dann valueToAdd zum aktuellen Wert, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Release- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) nach der atomaren Operation nicht neu geordnet werden dürfen.

Siehe auch „ operator+=()“ und „ fetchAndSubRelease()“.

T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)

Atomares „Fetch-and-AND“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt anschließend ein bitweises UND-Vorgang (AND) mit „ valueToAnd “ auf den aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Acquire- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe, die (in Programmreihenfolge) auf die atomare Operation folgen, nicht vor der atomaren Operation neu geordnet werden dürfen.

Siehe auch ` operator&=()`.

T QAtomicInteger::fetchAndAndOrdered(T valueToAnd)

Atomares „Fetch-and-AND“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt anschließend eine bitweise UND-Verknüpfung (AND) mit ` valueToAnd ` durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die Semantik „ordered memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu geordnet werden dürfen.

Siehe auch ` operator&=()`.

T QAtomicInteger::fetchAndAndRelaxed(T valueToAnd)

Atomares „Fetch-and-AND“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt anschließend ein bitweises UND-Verknüpfung (AND) mit „ valueToAnd “ auf den aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „relaxed“ Semantik von ` memory ordering `, sodass der Compiler und der Prozessor die Speicherzugriffe frei neu anordnen können.

Siehe auch ` operator&=()`.

T QAtomicInteger::fetchAndAndRelease(T valueToAnd)

Atomares „Fetch-and-AND“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt anschließend eine bitweise UND-Verknüpfung ( valueToAnd ) mit dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Release- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) nach der atomaren Operation nicht neu geordnet werden dürfen.

Siehe auch ` operator&=()`.

T QAtomicInteger::fetchAndOrAcquire(T valueToOr)

Atomares „Fetch-and-OR“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt dann ein bitweises OR- valueToOr -Vorgang mit dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Acquire- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe, die (in Programmreihenfolge) auf die atomare Operation folgen, nicht vor der atomaren Operation neu geordnet werden dürfen.

Siehe auch ` operator|=()`.

T QAtomicInteger::fetchAndOrOrdered(T valueToOr)

Atomares „Fetch-and-OR“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt anschließend eine bitweise ODER-Verknüpfung ( valueToOr ) mit dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die Semantik „ memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu geordnet werden dürfen.

Siehe auch ` operator|=()`.

T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)

Atomares „Fetch-and-OR“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt anschließend eine bitweise ODER-Verknüpfung ( valueToOr ) mit dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „relaxed“ Semantik von ` memory ordering `, sodass der Compiler und der Prozessor die Speicherzugriffe frei neu anordnen können.

Siehe auch ` operator|=()`.

T QAtomicInteger::fetchAndOrRelease(T valueToOr)

Atomares „Fetch-and-OR“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt anschließend eine bitweise ODER-Verknüpfung ( valueToOr ) mit dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Release- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) nach der atomaren Operation nicht neu geordnet werden dürfen.

Siehe auch ` operator|=()`.

T QAtomicInteger::fetchAndStoreAcquire(T newValue)

Atomares Fetch-and-Store.

Liest den aktuellen Wert dieses QAtomicInteger s und weist ihm anschließend den Wert ` newValue` zu, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Acquire- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe, die (in Programmreihenfolge) auf die atomare Operation folgen, nicht vor der atomaren Operation neu geordnet werden dürfen.

T QAtomicInteger::fetchAndStoreOrdered(T newValue)

Atomares Fetch-and-Store.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und weist ihm anschließend den Wert „ newValue “ zu, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die Semantik „ordered memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu angeordnet werden dürfen.

T QAtomicInteger::fetchAndStoreRelaxed(T newValue)

Atomisches Fetch-and-Store.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und weist ihm anschließend den Wert „ newValue “ zu, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „relaxed“ Semantik für „ memory ordering “, sodass der Compiler und der Prozessor die Speicherzugriffe frei neu anordnen können.

T QAtomicInteger::fetchAndStoreRelease(T newValue)

Atomischer Fetch-and-Store-Vorgang.

Liest den aktuellen Wert dieses QAtomicInteger s und weist ihm anschließend den Wert „ newValue “ zu, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Release- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) nach der atomaren Operation nicht neu geordnet werden dürfen.

T QAtomicInteger::fetchAndSubAcquire(T valueToSub)

Atomares „Fetch-and-Sub“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und subtrahiert dann „ valueToSub “ vom aktuellen Wert, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Acquire- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe, die (in Programmreihenfolge) auf die atomare Operation folgen, nicht vor der atomaren Operation neu geordnet werden dürfen.

Siehe auch ` operator-=()` und ` fetchAndAddAcquire()`.

T QAtomicInteger::fetchAndSubOrdered(T valueToSub)

Atomares „Fetch-and-Sub“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und subtrahiert anschließend „ valueToSub “ vom aktuellen Wert, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die Semantik „ memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu geordnet werden dürfen.

Siehe auch „ operator-=()“ und „ fetchAndAddOrdered()“.

T QAtomicInteger::fetchAndSubRelaxed(T valueToSub)

Atomares „Fetch-and-Sub“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und subtrahiert dann „ valueToSub “ vom aktuellen Wert, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet eine „relaxed“ Semantik für „ memory ordering “, sodass der Compiler und der Prozessor die Speicherzugriffe frei neu anordnen können.

Siehe auch „ operator-=()“ und „ fetchAndAddRelaxed()“.

T QAtomicInteger::fetchAndSubRelease(T valueToSub)

Atomares „Fetch-and-Sub“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und subtrahiert dann „ valueToSub “ vom aktuellen Wert, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Release- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) nach der atomaren Operation nicht neu geordnet werden dürfen.

Siehe auch ` operator-=()` und ` fetchAndAddRelease()`.

T QAtomicInteger::fetchAndXorAcquire(T valueToXor)

Atomares „Fetch-and-XOR“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt dann eine bitweise XOR-Verknüpfung zwischen „ valueToXor “ und dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Acquire- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe, die (in Programmreihenfolge) auf die atomare Operation folgen, nicht vor der atomaren Operation neu geordnet werden dürfen.

Siehe auch ` operator^=()`.

T QAtomicInteger::fetchAndXorOrdered(T valueToXor)

Atomares „Fetch-and-XOR“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt dann eine bitweise XOR-Verknüpfung zwischen „ valueToXor “ und dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die Semantik der geordneten „ memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu geordnet werden dürfen.

Siehe auch ` operator^=()`.

T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)

Atomares „Fetch-and-XOR“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt dann ein bitweises XOR- valueToXor mit dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet eine „relaxed“ Semantik für ` memory ordering `, sodass der Compiler und der Prozessor die Speicherzugriffe frei neu anordnen können.

Siehe auch ` operator^=()`.

T QAtomicInteger::fetchAndXorRelease(T valueToXor)

Atomares „Fetch-and-XOR“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt dann eine bitweise XOR-Verknüpfung ( valueToXor ) mit dem aktuellen Wert durch, wobei der ursprüngliche Wert zurückgegeben wird.

Diese Funktion verwendet die „Release- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) nach der atomaren Operation nicht neu geordnet werden dürfen.

Siehe auch ` operator^=()`.

[static constexpr] bool QAtomicInteger::isFetchAndAddNative()

Gibt „ true “ zurück, wenn „fetch-and-add“ mithilfe atomarer Prozessorbefehle implementiert ist, andernfalls „false“.

[static constexpr] bool QAtomicInteger::isFetchAndAddWaitFree()

Gibt „ true “ zurück, wenn das atomare „Fetch-and-Add“-Vorgang wartungsfrei ist, andernfalls „false“.

[static constexpr] bool QAtomicInteger::isFetchAndStoreNative()

Gibt „ true “ zurück, wenn „fetch-and-store“ mithilfe atomarer Prozessorbefehle implementiert ist, andernfalls „false“.

[static constexpr] bool QAtomicInteger::isFetchAndStoreWaitFree()

Gibt „ true “ zurück, wenn das atomare „Fetch-and-Store“-Vorgang wartungsfrei ist, andernfalls „false“.

[static constexpr] bool QAtomicInteger::isReferenceCountingNative()

Gibt „ true “ zurück, wenn die Referenzzählung mithilfe atomarer Prozessorbefehle implementiert ist, andernfalls „false“.

[static constexpr] bool QAtomicInteger::isReferenceCountingWaitFree()

Gibt „ true “ zurück, wenn die atomare Referenzzählung wartungsfrei ist, andernfalls „false“.

[static constexpr] bool QAtomicInteger::isTestAndSetNative()

Gibt „ true “ zurück, wenn „test-and-set“ mithilfe atomarer Prozessorbefehle implementiert ist, andernfalls „false“.

[static constexpr] bool QAtomicInteger::isTestAndSetWaitFree()

Gibt „ true “ zurück, wenn der atomare „Test-and-Set“-Vorgang wartungsfrei ist, andernfalls „false“.

T QAtomicInteger::loadAcquire() const

Lädt den Wert dieser ` QAtomicInteger ` atomar unter Verwendung der Speicherreihenfolge „Acquire“. Der Wert wird in keiner Weise verändert, es besteht jedoch keine Garantie dafür, dass er unverändert bleibt.

Siehe auch storeRelaxed() und loadRelaxed().

T QAtomicInteger::loadRelaxed() const

Lädt den Wert dieses ` QAtomicInteger ` atomar unter Verwendung einer entspannten Speicherreihenfolge. Der Wert wird in keiner Weise verändert, es besteht jedoch keine Garantie dafür, dass er unverändert bleibt.

Siehe auch „ storeRelaxed()“ und „ loadAcquire()“.

bool QAtomicInteger::ref()

Erhöht den Wert dieses QAtomicInteger atomar. Gibt „ true “ zurück, wenn der neue Wert ungleich Null ist, andernfalls „false“.

Diese Funktion verwendet die Semantik „ memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu angeordnet werden dürfen.

Siehe auch ` deref()` und ` operator++()`.

void QAtomicInteger::storeRelaxed(T newValue)

Speichert den Wert von „ newValue “ atomar in diesem atomaren Typ unter Verwendung einer gelockerten Speicherreihenfolge.

Siehe auch „ storeRelease()“ und „ loadRelaxed()“.

void QAtomicInteger::storeRelease(T newValue)

Speichert den Wert von „ newValue “ atomar in diesem atomaren Typ, wobei die Speicherreihenfolge „Release“ verwendet wird.

Siehe auch ` storeRelaxed()` und ` loadAcquire()`.

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

Atomares „test-and-set“.

Hinweis: Wenn Sie diese Funktion in einer Schleife verwenden, sollten Sie stattdessen die Überladung mit dem zusätzlichen Argument „ T &currentValue “ in Betracht ziehen, wodurch der zusätzliche Aufruf von „ loadAcquire()“ bei einem Fehlschlag vermieden wird.

Ist der aktuelle Wert dieses ` QAtomicInteger ` der ` expectedValue`, weisen die „Test-and-Set“-Funktionen diesem ` QAtomicInteger ` den ` newValue ` zu und geben `true` zurück. Sind die Werte nicht identisch, führt diese Funktion keine Aktion aus und gibt ` false` zurück.

Diese Funktion verwendet die „Acquire- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe, die (in Programmreihenfolge) auf die atomare Operation folgen, nicht vor der atomaren Operation neu geordnet werden dürfen.

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

Atomares „Test-and-Set“.

Wenn der aktuelle Wert dieses „ QAtomicInteger “ der „ expectedValue “ ist, weisen die „Test-and-Set“-Funktionen dem „ QAtomicInteger “ den „ newValue “ zu und geben „ true “ zurück. Sind die Werte nicht identisch, laden die Funktionen den aktuellen Wert dieses „ QAtomicInteger “ in „ currentValue “ und geben „ false “ zurück.

Diese Funktion verwendet die Semantik „acquire memory ordering “, die sicherstellt, dass Speicherzugriffe, die (in Programmreihenfolge) auf die atomare Operation folgen, nicht vor der atomaren Operation neu geordnet werden dürfen. Wenn der Test-and-Set-Vorgang fehlschlägt, wird currentValue mit der Semantik „acquire memory ordering “ geladen.

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

Atomares „Test-and-Set“.

Hinweis: Wenn Sie diese Funktion in einer Schleife verwenden, sollten Sie stattdessen die Überladung mit dem zusätzlichen Argument „ T &currentValue “ in Betracht ziehen, wodurch der zusätzliche Aufruf von „ loadAcquire()“ bei einem Fehlschlag vermieden wird.

Ist der aktuelle Wert dieses „ QAtomicInteger “ der „ expectedValue “, weisen die „test-and-set“-Funktionen den „ newValue “ diesem „ QAtomicInteger “ zu und geben „true“ zurück. Sind die Werte nicht identisch, führt diese Funktion keine Aktion durch und gibt „ false “ zurück.

Diese Funktion verwendet die Semantik „ memory ordering “, die gewährleistet, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu geordnet werden dürfen.

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

Atomares „Test-and-Set“.

Wenn der aktuelle Wert dieses „ QAtomicInteger “ dem „ expectedValue “ entspricht, weisen die „Test-and-Set“-Funktionen dem „ QAtomicInteger “ den „ newValue “ zu und geben „ true “ zurück. Sind die Werte nicht identisch, wird der aktuelle Wert dieses „ QAtomicInteger “ in „ currentValue “ geladen und „ false “ zurückgegeben.

Diese Funktion verwendet die Semantik „ memory ordering “, die sicherstellt, dass Speicherzugriffe vor und nach der atomaren Operation (in Programmreihenfolge) nicht neu geordnet werden dürfen. Wenn der „Test-and-Set“-Vorgang fehlschlägt, wird die Variable „ currentValue “ mit der Semantik „ memory ordering “ geladen.

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

Atomares „Test-and-Set“.

Hinweis: Wenn Sie diese Funktion in einer Schleife verwenden, sollten Sie stattdessen die Überladung mit dem zusätzlichen Argument „ T &currentValue “ in Betracht ziehen, wodurch der zusätzliche Aufruf von „ loadRelaxed()“ bei einem Fehlschlag vermieden wird.

Ist der aktuelle Wert von ` QAtomicInteger ` gleich ` expectedValue`, weisen die „Test-and-Set“-Funktionen ` newValue ` diesem ` QAtomicInteger ` zu und geben `true` zurück. Sind die Werte nicht identisch, führt diese Funktion keine Aktion durch und gibt ` false` zurück.

Diese Funktion verwendet eine „relaxed“ memory ordering -Semantik, wodurch es dem Compiler und dem Prozessor freisteht, Speicherzugriffe neu zu ordnen.

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

Atomares „Test-and-Set“.

Wenn der aktuelle Wert dieses „ QAtomicInteger “ mit dem Wert „ expectedValue “ übereinstimmt, weisen die „Test-and-Set“-Funktionen diesem „ QAtomicInteger “ den Wert „ newValue “ zu und geben „ true “ zurück. Sind die Werte nicht identisch, laden die Funktionen den aktuellen Wert dieses „ QAtomicInteger “ in „ currentValue “ und geben „ false “ zurück.

Diese Funktion verwendet die „relaxed“ Semantik von ` memory ordering `, sodass Compiler und Prozessor die Speicherzugriffe frei neu anordnen können. Wenn der „Test-and-Set“-Vorgang fehlschlägt, wird ` currentValue ` mit der „relaxed“ Semantik von ` memory ordering ` geladen.

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

Atomares „Test-and-Set“.

Hinweis: Wenn Sie diese Funktion in einer Schleife verwenden, sollten Sie stattdessen die Überladung mit dem zusätzlichen Argument „ T &currentValue “ in Betracht ziehen, wodurch der zusätzliche Aufruf von „ loadRelaxed()“ im Fehlerfall vermieden wird.

Ist der aktuelle Wert dieses „ QAtomicInteger “ der „ expectedValue “, weisen die „test-and-set“-Funktionen den „ newValue “ diesem „ QAtomicInteger “ zu und geben „true“ zurück. Sind die Werte nicht identisch, führt diese Funktion keine Aktion aus und gibt „ false “ zurück.

Diese Funktion verwendet die „Release- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) nach der atomaren Operation nicht neu geordnet werden dürfen.

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

Atomares „Test-and-Set“.

Wenn der aktuelle Wert dieses „ QAtomicInteger “ mit dem „ expectedValue “ übereinstimmt, weisen die „Test-and-Set“-Funktionen diesem „ QAtomicInteger “ den „ newValue “ zu und geben „ true “ zurück. Stimmen die Werte nicht überein, laden die Funktionen den aktuellen Wert dieses „ QAtomicInteger “ in „ currentValue “ und geben „ false “ zurück.

Diese Funktion verwendet die „Release- memory ordering “-Semantik, die sicherstellt, dass Speicherzugriffe vor der atomaren Operation (in Programmreihenfolge) nach der atomaren Operation nicht neu geordnet werden dürfen. Wenn der „Test-and-Set“-Vorgang fehlschlägt, wird „ currentValue “ mit der „Relaxed- memory ordering “-Semantik geladen.

QAtomicInteger::operator T() const

Lädt den Wert dieses ` QAtomicInteger ` atomar, wobei nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge verwendet wird; andernfalls die „Acquire“-Reihenfolge. Der Wert wird in keiner Weise verändert, es gibt jedoch keine Garantie dafür, dass dies auch so bleibt.

Siehe auch loadRelaxed() und loadAcquire().

T QAtomicInteger::operator&=(T value)

Atomares Hinzufügen und Abrufen.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt anschließend ein bitweises AND- value -Verknüpfung mit dem aktuellen Wert durch, wobei der neue Wert zurückgegeben wird.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls die Reihenfolge „Ordered“.

Siehe auch ` fetchAndAndOrdered()`.

T QAtomicInteger::operator++()

Erhöht den Wert dieses „ QAtomicInteger “ atomar um einen Schritt. Gibt den neuen Wert dieses „Atomic“ zurück.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls die Reihenfolge „Ordered“.

Siehe auch ref(), operator++(int) und operator--().

T QAtomicInteger::operator++(int)

Erhöht den Wert dieses „ QAtomicInteger “ atomar um eins. Gibt den alten Wert dieses „ “ zurück.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls die Reihenfolge „Ordered“.

Siehe auch ref(), operator++() und operator--(int).

T QAtomicInteger::operator+=(T value)

Atomisches Add-and-Fetch.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und addiert dann „ value “ zum aktuellen Wert, wobei der neue Wert zurückgegeben wird.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls die Reihenfolge „Ordered“.

Siehe auch „ fetchAndAddOrdered()“ und „ operator-=()“.

T QAtomicInteger::operator--()

Verringert den Wert dieses „ QAtomicInteger “ atomar um eins. Gibt den neuen Wert dieses „Atomic“ zurück.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls die Reihenfolge „Ordered“.

Siehe auch deref(), operator--(int) und operator++().

T QAtomicInteger::operator--(int)

Führt eine atomare Nachdekrementierung des Werts dieses „ QAtomicInteger “ durch. Gibt den alten Wert dieses „atomic“ zurück.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls die Reihenfolge „Ordered“.

Siehe auch deref(), operator--() und operator++(int).

T QAtomicInteger::operator-=(T value)

Atomares „Sub-and-Fetch“.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und subtrahiert dann „ value “ vom aktuellen Wert, wobei der neue Wert zurückgegeben wird.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls die Reihenfolge „Ordered“.

Siehe auch „ fetchAndSubOrdered()“ und „ operator+=()“.

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

Speichert den anderen Wert atomar in diesem atomaren Typ, wobei nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge verwendet wird; andernfalls die „Release“-Reihenfolge. Diese Funktion gibt eine Referenz auf dieses Objekt zurück.

Siehe auch storeRelaxed() und storeRelease().

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

Weist „ other “ diesem „ QAtomicInteger “ zu und gibt eine Referenz auf dieses „ QAtomicInteger “ zurück.

T QAtomicInteger::operator^=(T value)

Atomares XOR-und-Abrufen.

Liest den aktuellen Wert dieses ` QAtomicInteger ` und führt dann eine bitweise XOR-Verknüpfung von ` value ` mit dem aktuellen Wert durch, woraufhin der neue Wert zurückgegeben wird.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls die Reihenfolge „Ordered“.

Siehe auch fetchAndXorOrdered().

T QAtomicInteger::operator|=(T value)

Atomares OR-und-Fetch.

Liest den aktuellen Wert dieses „ QAtomicInteger “ und führt dann eine bitweise ODER-Verknüpfung ( value ) mit dem aktuellen Wert durch, wobei der neue Wert zurückgegeben wird.

Diese Funktion verwendet nach Möglichkeit eine sequenziell konsistente Speicherreihenfolge; andernfalls eine „Ordered“-Reihenfolge.

Siehe auch ` fetchAndOrOrdered()`.

Verwandte Nicht-Mitglieder

[noexcept, since 6.7] void qYieldCpu()

Hält die Ausführung des aktuellen Threads mithilfe von Hardware-Befehlen für eine unbestimmte Zeit an, ohne diesen Thread aus dem Ausführungsplan zu entfernen. Diese Funktion ist für den Einsatz in Schleifen mit hohem Durchsatz vorgesehen, in denen der Code darauf wartet, dass ein anderer Thread eine atomare Variable ändert. Dies unterscheidet sich grundlegend von ` QThread::yieldCurrentThread()`, einer Operation auf Betriebssystemebene, die den gesamten Thread von der CPU entfernen und anderen Threads (möglicherweise aus anderen Prozessen) die Ausführung ermöglichen kann.

Anstatt also

while (!condition)
    ;

sollte man schreiben

while (!condition)
    qYieldCpu();

Dies ist sowohl mit als auch ohne Hardware-Multithreading auf demselben Kern nützlich. Im Falle von Hardware-Threads dient es dazu, zu verhindern, dass weitere spekulative Ausführungen die Pipeline füllen, was den Geschwister-Thread um Ressourcen bringen könnte. Über Kerne und höhere Abstraktionsebenen hinweg ermöglicht es dem Cache-Kohärenzprotokoll, die zu ändernde und zu überprüfende Cache-Zeile dem logischen Prozessor zuzuweisen, dessen Ergebnis dieser Code erwartet.

Es wird außerdem empfohlen, Code, der die globale Variable nicht verändert, in eine Schleife zu verpacken, um Konflikte beim exklusiven Zugriff auf die Speicherstelle zu vermeiden. Daher sollte eine atomare Änderungsschleife, wie beispielsweise die Erlangung eines Spinlocks, wie folgt aussehen:

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

Auf x86-Prozessoren und auf RISC-V-Prozessoren mit der „ Zihintpause “-Erweiterung wird dadurch der Befehl „ PAUSE “ ausgegeben, der auf Prozessoren, die ihn nicht unterstützen, ignoriert wird; auf ARMv7- oder neueren ARM-Prozessoren wird der Befehl „ YIELD “ ausgegeben.

Diese Funktion wurde in Qt 6.7 eingeführt.

Makro-Dokumentation

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE

Dieses Makro ist genau dann definiert, wenn Ihr Prozessor atomare „Fetch-and-Add“-Operationen für Ganzzahlen unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE

Dieses Makro ist definiert, wenn die Hardware keine atomaren „Fetch-and-Add“-Operationen für Ganzzahlen unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_SOMETIMES_NATIVE

Dieses Makro wird definiert, wenn nur bestimmte Prozessorgenerationen atomares „Fetch-and-Add“ für Ganzzahlen unterstützen. Verwenden Sie die Funktion ` QAtomicInteger::isFetchAndAddNative()``, um zu überprüfen, was Ihr Prozessor unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE

Dieses Makro wird zusammen mit „ Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE “ definiert, um anzugeben, dass der atomare „Fetch-and-Add“-Befehl für Ganzzahlen wartungsfrei ist.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE

Dieses Makro ist genau dann definiert, wenn Ihr Prozessor atomare Fetch-and-Store-Operationen für Ganzzahlen unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_NOT_NATIVE

Dieses Makro wird definiert, wenn die Hardware keine atomaren Fetch-and-Store-Operationen für Ganzzahlen unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_SOMETIMES_NATIVE

Dieses Makro ist definiert, wenn nur bestimmte Prozessorgenerationen atomares „Fetch-and-Store“ für Ganzzahlen unterstützen. Verwenden Sie die Funktion ` QAtomicInteger::isFetchAndStoreNative()` zur Überprüfung der von Ihrem Prozessor unterstützten Funktionen.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_WAIT_FREE

Dieses Makro wird zusammen mit „ Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE “ definiert, um anzugeben, dass der atomare Fetch-and-Store-Vorgang bei Ganzzahlen wartungsfrei ist.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_IS_SUPPORTED

Dieses Makro ist definiert, wenn atomare Ganzzahlen der Größe nn (in Bit) in dieser Compiler-/Architekturkombination unterstützt werden.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Die folgenden Makros sind immer definiert:

  • Q_ATOMIC_INT8_IS_SUPPORTED
  • Q_ATOMIC_INT16_IS_SUPPORTED
  • Q_ATOMIC_INT32_IS_SUPPORTED

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE

Dieses Makro ist genau dann definiert, wenn alle Generationen Ihres Prozessors atomares Referenzzählen unterstützen.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_NOT_NATIVE

Dieses Makro wird definiert, wenn die Hardware keine atomare Referenzzählung unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE

Dieses Makro ist definiert, wenn nur bestimmte Prozessorgenerationen die atomare Referenzzählung unterstützen. Verwenden Sie die Funktion „ QAtomicInteger::isReferenceCountingNative()“, um zu prüfen, was Ihr Prozessor unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_WAIT_FREE

Dieses Makro wird zusammen mit „ Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE “ definiert, um anzugeben, dass die Referenzzählung wartungsfrei ist.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE

Dieses Makro ist genau dann definiert, wenn Ihr Prozessor atomares „Test-and-Set“ für Ganzzahlen unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_NOT_NATIVE

Dieses Makro wird definiert, wenn die Hardware kein atomares „Test-and-Set“ für Ganzzahlen unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_SOMETIMES_NATIVE

Dieses Makro ist definiert, wenn nur bestimmte Prozessorgenerationen das atomare „Test-and-Set“ für Ganzzahlen unterstützen. Verwenden Sie die Funktion „ QAtomicInteger::isTestAndSetNative()“, um zu prüfen, was Ihr Prozessor unterstützt.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_WAIT_FREE

Dieses Makro wird zusammen mit „ Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE “ definiert, um anzugeben, dass der atomare „Test-and-Set“-Vorgang für Ganzzahlen wartungsfrei ist.

nn ist die Größe der Ganzzahl in Bit (8, 16, 32 oder 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.