Sur cette page

QAtomicInteger Class

template <typename T> class QAtomicInteger

La classe `QAtomicInteger` permet d'effectuer des opérations atomiques sur des entiers, indépendamment de la plate-forme. En savoir plus...

En-tête : #include <QAtomicInteger>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Hérité par :

QAtomicInt

Fonctions publiques

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)

Membres publics statiques

(since 6.7) void qYieldCpu()

Macros

Description détaillée

Pour les opérations atomiques sur les pointeurs, voir la classe ` QAtomicPointer `.

Une opération atomique est une opération complexe qui s'exécute sans interruption. La classe QAtomicInteger fournit des opérations atomiques de comptage de références, de test-and-set, de fetch-and-store et de fetch-and-add pour les entiers. Le paramètre de modèle T spécifie le type d'entier à rendre atomique.

Le paramètre de modèle T doit être un type entier C++ :

  • 8 bits : bool, char, signed char, unsigned char, qint8, quint8, char8_t (C++20)
  • 16 bits : short, unsigned short, qint16, quint16, char16_t
  • 32 bits : int, unsigned int, qint32, quint32, char32_t
  • 64 bits : long long, unsigned long long, qint64, quint64
  • taille spécifique à la plateforme : long, unsigned long
  • taille des pointeurs : qintptr, quintptr, qptrdiff

Parmi la liste ci-dessus, seules les instanciations de taille 8 bits, 16 bits, 32 bits et de taille pointeur sont garanties de fonctionner sur toutes les plateformes. La prise en charge des autres tailles dépend du compilateur et de l’architecture du processeur pour lesquels le code est compilé. Pour vérifier si les types 64 bits sont pris en charge sur les plateformes 32 bits, consultez la macro ` Q_ATOMIC_INT64_IS_SUPPORTED`.

L'API Atomic

Comptage de références

Les fonctions ` ref()` et ` deref()` fournissent une API efficace de comptage des références. La valeur de retour de ces fonctions indique quand la dernière référence a été libérée. Ces fonctions vous permettent d’implémenter vos propres classes à partage implicite.

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

Ordre de la mémoire

QAtomicInteger fournit plusieurs implémentations des fonctions atomiques « test-and-set », « fetch-and-store » et « fetch-and-add ». Chaque implémentation définit une sémantique d’ordonnancement de la mémoire qui décrit comment les accès mémoire entourant l’instruction atomique sont exécutés par le processeur. Étant donné que de nombreuses architectures modernes autorisent l’exécution hors ordre et l’ordonnancement de la mémoire, il est nécessaire d’utiliser la sémantique appropriée pour garantir le bon fonctionnement de votre application sur tous les processeurs.

  • Relaxed : l'ordre de la mémoire n’est pas spécifié, ce qui laisse au compilateur et au processeur la liberté de réorganiser les accès à la mémoire.
  • « Acquire » : les accès mémoire suivant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés avant l’opération atomique.
  • Release : les accès à la mémoire précédant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés après l’opération atomique.
  • « Ordered » : combine les sémantiques « Acquire » et « Release ».

Test-and-set

Si la valeur actuelle du QAtomicInteger correspond à la valeur attendue, les fonctions « test-and-set » attribuent une nouvelle valeur au QAtomicInteger et renvoient « true ». Si les valeurs ne correspondent pas, ces fonctions ne font rien et renvoient « false ». Cette opération équivaut au code suivant :

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

Il existe 4 fonctions « test-and-set » : ` testAndSetRelaxed()`, ` testAndSetAcquire()`, ` testAndSetRelease()` et ` testAndSetOrdered()`. Voir ci-dessus pour une explication des différentes sémantiques d’ordonnancement de la mémoire.

Lecture et écriture

Les fonctions atomiques de lecture et d’écriture lisent la valeur actuelle du QAtomicInteger, puis lui attribuent une nouvelle valeur, en renvoyant la valeur d’origine. Cette opération équivaut au code suivant :

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

Il existe 4 fonctions de lecture-écriture : fetchAndStoreRelaxed(), fetchAndStoreAcquire(), fetchAndStoreRelease() et fetchAndStoreOrdered(). Voir ci-dessus pour une explication des différentes sémantiques d’ordonnancement de la mémoire.

Lecture et ajout

Les fonctions atomiques de lecture et d’ajout lisent la valeur actuelle du QAtomicInteger, puis ajoutent la valeur fournie à cette valeur, en renvoyant la valeur d’origine. Cette opération équivaut au code suivant :

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

Il existe 4 fonctions de lecture-et-ajout : fetchAndAddRelaxed(), fetchAndAddAcquire(), fetchAndAddRelease() et fetchAndAddOrdered(). Voir ci-dessus pour une explication des différentes sémantiques d’ordre mémoire.

Tests de fonctionnalités pour l’API atomique

Fournir une API atomique indépendante de la plate-forme et fonctionnant sur tous les processeurs représente un véritable défi. L’API fournie par QAtomicInteger est garantie de fonctionner de manière atomique sur tous les processeurs. Cependant, comme tous les processeurs ne prennent pas en charge l’ensemble des opérations fournies par QAtomicInteger, il est nécessaire d’exposer des informations sur le processeur.

Vous pouvez vérifier au moment de la compilation quelles fonctionnalités sont prises en charge par votre matériel à l’aide de diverses macros. Celles-ci vous indiqueront si votre matériel prend en charge une opération particulière de manière systématique, occasionnelle ou pas du tout. Les macros se présentent sous la formeQ_ATOMIC_INTnn_OPERATION_IS_HOW_NATIVE. nn correspond à la taille de l'entier (en bits), OPERATION est l'une des valeurs suivantes : REFERENCE_COUNTING, TEST_AND_SET, FETCH_AND_STORE ou FETCH_AND_ADD, et HOW est l'une des valeurs suivantes : ALWAYS, SOMETIMES ou NOT. Il y aura toujours exactement une macro définie par opération. Par exemple, si Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVE est définie, ni Q_ATOMIC_INT_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE ni Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_NOT_NATIVE ne seront définies.

Une opération qui s'exécute en temps constant est dite « sans attente » (wait-free). Ces opérations ne sont pas implémentées à l'aide de verrous ou de boucles d'aucune sorte. Pour les opérations atomiques qui sont toujours prises en charge et qui sont « sans attente », Qt définit la constanteQ_ATOMIC_INTnn_OPERATION_IS_WAIT_FREE en plus deQ_ATOMIC_INTnn_OPERATION_IS_ALWAYS_NATIVE.

Dans les cas où une opération atomique n’est prise en charge que par les nouvelles générations de processeurs, QAtomicInteger fournit également un moyen de vérifier à l’exécution ce que votre matériel prend en charge grâce aux fonctions ` isReferenceCountingNative()`, ` isTestAndSetNative()`, ` isFetchAndStoreNative()` et ` isFetchAndAddNative()`. Les implémentations « sans attente » peuvent être détectées à l’aide des fonctions ` isReferenceCountingWaitFree()`, ` isTestAndSetWaitFree()`, ` isFetchAndStoreWaitFree()` et ` isFetchAndAddWaitFree()`.

Vous trouverez ci-dessous la liste complète de toutes les macros de fonctionnalités pour 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_EST_PARFOIS_NATIF
  • Q_ATOMIC_INTnn_TEST_AND_SET_N'EST_PAS_NATIF
  • Q_ATOMIC_INTnn_TEST_AND_SET_IS_WAIT_FREE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_STORE_EST_PARFOIS_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_EST_PARFOIS_NATIF
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE
  • Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE

Pour des raisons de compatibilité avec les versions antérieures de Qt, les macros dont le paramètre nn est vide sont équivalentes aux macros 32 bits. Par exemple, Q_ATOMIC_INT_REFERENCE_COUNTING_IS_WAIT_FREE est identique à Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_WAIT_FREE.

Voir également QAtomicPointer.

Documentation sur les fonctions membres

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

Crée un objet `QAtomicInteger` avec l'value` spécifié.

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

Crée une copie de other.

bool QAtomicInteger::deref()

Décrémente de manière atomique la valeur de cette QAtomicInteger. Renvoie « true » si la nouvelle valeur est différente de zéro, « false » dans le cas contraire.

Cette fonction utilise la sémantique ordonnée de ` memory ordering `, qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés.

Voir également ` ref()` et ` operator--()`.

T QAtomicInteger::fetchAndAddAcquire(T valueToAdd)

Opération atomique « fetch-and-add ».

Lit la valeur actuelle de cette QAtomicInteger, puis ajoute valueToAdd à cette valeur, et renvoie la valeur d'origine.

Cette fonction utilise la sémantique « acquire- memory ordering », qui garantit que les accès à la mémoire suivant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés avant l’opération atomique.

Voir également ` operator+=()` et ` fetchAndSubAcquire()`.

T QAtomicInteger::fetchAndAddOrdered(T valueToAdd)

Opération atomique « fetch-and-add ».

Lit la valeur actuelle de cette QAtomicInteger, puis ajoute valueToAdd à cette valeur, et renvoie la valeur d’origine.

Cette fonction utilise la sémantique des « ordered memory ordering s », qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés.

Voir également ` operator+=()` et ` fetchAndSubOrdered()`.

T QAtomicInteger::fetchAndAddRelaxed(T valueToAdd)

Opération atomique « fetch-and-add ».

Lit la valeur actuelle de cett QAtomicInteger, puis ajoute valueToAdd à cette valeur, et renvoie la valeur d’origine.

Cette fonction utilise la sémantique « relaxed » de la fonction ` memory ordering `, laissant ainsi au compilateur et au processeur la liberté de réorganiser les accès en mémoire.

Voir également ` operator+=()` et ` fetchAndSubRelaxed()`.

T QAtomicInteger::fetchAndAddRelease(T valueToAdd)

Opération atomique « fetch-and-add ».

Lit la valeur actuelle de c QAtomicInteger, puis ajoute l’ valueToAdd e à cette valeur, et renvoie la valeur d’origine.

Cette fonction utilise la sémantique « release- memory ordering », qui garantit que les accès à la mémoire antérieurs à l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés après l’opération atomique.

Voir également ` operator+=()` et ` fetchAndSubRelease()`.

T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)

Opération atomique « fetch-and-and ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue une opération AND bit à bit entre valueToAnd et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique « acquire- memory ordering », qui garantit que les accès à la mémoire suivant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés avant l’opération atomique.

Voir également ` operator&=()`.

T QAtomicInteger::fetchAndAndOrdered(T valueToAnd)

Opération atomique « fetch-and-and ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue un ET binaire entre valueToAnd et la valeur actuelle, et renvoie la valeur d’origine.

Cette fonction utilise la sémantique des « ord memory ordering », qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés.

Voir également ` operator&=()`.

T QAtomicInteger::fetchAndAndRelaxed(T valueToAnd)

Opération atomique « fetch-and-and ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue une opération AND bit à bit entre valueToAnd et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise une sémantique d’ memory ordering « assouplie », laissant au compilateur et au processeur la liberté de réorganiser les accès mémoire.

Voir également ` operator&=()`.

T QAtomicInteger::fetchAndAndRelease(T valueToAnd)

Opération atomique « fetch-and-and ».

Lit la valeur actuelle de cett QAtomicInteger, puis effectue une opération AND bit à bit entre valueToAnd et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique « release- memory ordering », qui garantit que les accès à la mémoire précédant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés après l’opération atomique.

Voir également operator&=().

T QAtomicInteger::fetchAndOrAcquire(T valueToOr)

Opération atomique « fetch-and-or ».

Lit la valeur actuelle de cett QAtomicInteger, puis effectue un OU bit à bit entre valueToOr et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique « acquire- memory ordering », qui garantit que les accès à la mémoire suivant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés avant l’opération atomique.

Voir également operator|=().

T QAtomicInteger::fetchAndOrOrdered(T valueToOr)

Opération atomique « fetch-and-or ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue une opération OR bit à bit entre valueToOr et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique des « ordres d'memory ordering », qui garantit que les accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peuvent pas être réorganisés.

Voir également ` operator|=()`.

T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)

Opération atomique « fetch-and-or ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue une opération OR bit à bit entre valueToOr et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique « relaxed » d'memory ordering, laissant au compilateur et au processeur la liberté de réorganiser les accès à la mémoire.

Voir également ` operator|=()`.

T QAtomicInteger::fetchAndOrRelease(T valueToOr)

Opération atomique « fetch-and-or ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue une opération OU bit à bit entre valueToOr et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique « release- memory ordering », qui garantit que les accès à la mémoire antérieurs à l'opération atomique (dans l'ordre du programme) ne peuvent pas être réordonnés après l'opération atomique.

Voir également ` operator|=()`.

T QAtomicInteger::fetchAndStoreAcquire(T newValue)

Opération atomique de lecture-écriture.

Lit la valeur actuelle de cette QAtomicInteger, puis lui attribue l'newValue, en renvoyant la valeur d'origine.

Cette fonction utilise la sémantique « acquire- memory ordering », qui garantit que les accès à la mémoire suivant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés avant ladite opération.

T QAtomicInteger::fetchAndStoreOrdered(T newValue)

Opération atomique de lecture-écriture.

Lit la valeur actuelle de cette QAtomicInteger, puis lui attribue l’ newValue, en renvoyant la valeur d’origine.

Cette fonction utilise la sémantique des « ordered memory ordering s », qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés.

T QAtomicInteger::fetchAndStoreRelaxed(T newValue)

Opération atomique de lecture et d'écriture.

Lit la valeur actuelle de cette QAtomicInteger, puis lui attribue l'newValue, en renvoyant la valeur d'origine.

Cette fonction utilise une sémantique « relaxed » d'memory ordering, laissant au compilateur et au processeur la liberté de réorganiser les accès mémoire.

T QAtomicInteger::fetchAndStoreRelease(T newValue)

Opération atomique de lecture-écriture.

Lit la valeur actuelle de cet QAtomicInteger, puis lui attribue l’ newValue, en renvoyant la valeur d’origine.

Cette fonction utilise la sémantique « release- memory ordering », qui garantit que les accès à la mémoire antérieurs à l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés après l’opération atomique.

T QAtomicInteger::fetchAndSubAcquire(T valueToSub)

Opération atomique « fetch-and-sub ».

Lit la valeur actuelle de cette QAtomicInteger, puis soustrait valueToSub de cette valeur, et renvoie la valeur d’origine.

Cette fonction utilise la sémantique « acquire- memory ordering », qui garantit que les accès à la mémoire suivant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés avant l’opération atomique.

Voir également ` operator-=()` et ` fetchAndAddAcquire()`.

T QAtomicInteger::fetchAndSubOrdered(T valueToSub)

Opération atomique « fetch-and-sub ».

Lit la valeur actuelle de cette QAtomicInteger, puis soustrait valueToSub de cette valeur, et renvoie la valeur d’origine.

Cette fonction utilise la sémantique des « ordered memory ordering », qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés.

Voir également operator-=() et fetchAndAddOrdered().

T QAtomicInteger::fetchAndSubRelaxed(T valueToSub)

Opération atomique « fetch-and-sub ».

Lit la valeur actuelle de cette QAtomicInteger, puis soustrait valueToSub de cette valeur, et renvoie la valeur d'origine.

Cette fonction utilise une sémantique d’ memory ordering « relaxed », laissant au compilateur et au processeur la liberté de réorganiser les accès mémoire.

Voir également ` operator-=()` et ` fetchAndAddRelaxed()`.

T QAtomicInteger::fetchAndSubRelease(T valueToSub)

Opération atomique « fetch-and-sub ».

Lit la valeur actuelle de cette QAtomicInteger, puis soustrait l'valueToSub e de cette valeur, renvoyant ainsi la valeur d'origine.

Cette fonction utilise la sémantique « release- memory ordering », qui garantit que les accès à la mémoire antérieurs à l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés après l’opération atomique.

Voir également operator-=() et fetchAndAddRelease().

T QAtomicInteger::fetchAndXorAcquire(T valueToXor)

Opération atomique « fetch-and-xor ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue une opération XOR bit à bit entre valueToXor et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique « acquire- memory ordering », qui garantit que les accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peuvent pas être réordonnés avant l'opération atomique.

Voir également operator^=().

T QAtomicInteger::fetchAndXorOrdered(T valueToXor)

Opération atomique « fetch-and-xor ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue une opération XOR bit à bit entre valueToXor et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique des « ord memory ordering », qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés.

Voir également ` operator^=()`.

T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)

Opération atomique « fetch-and-xor ».

Lit la valeur actuelle de cett QAtomicInteger, puis effectue une opération XOR bit à bit entre valueToXor et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise une sémantique d'memory ordering e « assouplie », laissant au compilateur et au processeur la liberté de réorganiser les accès en mémoire.

Voir également ` operator^=()`.

T QAtomicInteger::fetchAndXorRelease(T valueToXor)

Opération atomique « fetch-and-xor ».

Lit la valeur actuelle de cett QAtomicInteger, puis effectue une opération XOR bit à bit entre valueToXor et la valeur actuelle, renvoyant ainsi la valeur d’origine.

Cette fonction utilise la sémantique « release- memory ordering », qui garantit que les accès à la mémoire antérieurs à l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés après l’opération atomique.

Voir également operator^=().

[static constexpr] bool QAtomicInteger::isFetchAndAddNative()

Renvoie « true » si la fonction « fetch-and-add » est implémentée à l'aide d'instructions atomiques du processeur ; renvoie « false » dans le cas contraire.

[static constexpr] bool QAtomicInteger::isFetchAndAddWaitFree()

Renvoie « true » si l'opération « fetch-and-add » atomique est sans attente, et « false » dans le cas contraire.

[static constexpr] bool QAtomicInteger::isFetchAndStoreNative()

Renvoie « true » si la fonction « fetch-and-store » est implémentée à l'aide d'instructions atomiques du processeur ; « false » dans le cas contraire.

[static constexpr] bool QAtomicInteger::isFetchAndStoreWaitFree()

Renvoie « true » si l'opération « fetch-and-store » atomique est sans attente, « false » dans le cas contraire.

[static constexpr] bool QAtomicInteger::isReferenceCountingNative()

Renvoie « true » si le comptage des références est mis en œuvre à l'aide d'instructions atomiques du processeur, « false » dans le cas contraire.

[static constexpr] bool QAtomicInteger::isReferenceCountingWaitFree()

Renvoie « true » si le comptage atomique des références est sans attente, « false » dans le cas contraire.

[static constexpr] bool QAtomicInteger::isTestAndSetNative()

Renvoie « true » si la fonction « test-and-set » est implémentée à l'aide d'instructions atomiques du processeur ; sinon, elle renvoie « false ».

[static constexpr] bool QAtomicInteger::isTestAndSetWaitFree()

Renvoie « true » si l’opération « test-and-set » atomique est sans attente, « false » dans le cas contraire.

T QAtomicInteger::loadAcquire() const

Charge de manière atomique la valeur de cet QAtomicInteger en utilisant l'ordre de mémoire « Acquire ». La valeur n'est en aucun cas modifiée, mais notez qu'il n'y a aucune garantie qu'elle le reste.

Voir également storeRelaxed() et loadRelaxed().

T QAtomicInteger::loadRelaxed() const

Charge de manière atomique la valeur de cet QAtomicInteger en utilisant un ordre de mémoire assoupli. La valeur n'est en aucun cas modifiée, mais notez qu'il n'y a aucune garantie qu'elle reste inchangée.

Voir également storeRelaxed() et loadAcquire().

bool QAtomicInteger::ref()

Incrémente de manière atomique la valeur de cette QAtomicInteger. Renvoie « true » si la nouvelle valeur est différente de zéro, « false » dans le cas contraire.

Cette fonction utilise la sémantique ordonnée de ` memory ordering `, qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés.

Voir également ` deref()` et ` operator++()`.

void QAtomicInteger::storeRelaxed(T newValue)

Enregistre de manière atomique la valeur newValue dans ce type atomique, en utilisant un ordre de mémoire assoupli.

Voir également ` storeRelease()` et ` loadRelaxed()`.

void QAtomicInteger::storeRelease(T newValue)

Enregistre de manière atomique la valeur newValue dans ce type atomique, en utilisant l'ordre de mémoire « Release ».

Voir également ` storeRelaxed()` et ` loadAcquire()`.

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

Test-and-set atomique.

Remarque : si vous utilisez cette fonction dans une boucle, envisagez plutôt d'utiliser la surcharge avec l'argument supplémentaire ` T &currentValue `, ce qui évite l'appel supplémentaire à ` loadAcquire()` en cas d'échec.

Si la valeur actuelle de ce QAtomicInteger correspond à l’ expectedValue, les fonctions « test-and-set » attribuent l’ newValue à ce QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, cette fonction ne fait rien et renvoie false.

Cette fonction utilise la sémantique « acquire- memory ordering », qui garantit que les accès à la mémoire suivant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés avant l’opération atomique.

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

Test-et-initialisation atomique.

Si la valeur actuelle de cette QAtomicInteger correspond à l’ expectedValue, les fonctions « test-and-set » attribuent l’ newValue à cette QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, les fonctions chargent la valeur actuelle de cette QAtomicInteger dans currentValue et renvoient false.

Cette fonction utilise la sémantique « acquire » memory ordering, qui garantit que les accès à la mémoire suivant l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés avant l’opération atomique. Si le test-and-set échoue, la variable currentValue est chargée avec la sémantique « acquire » memory ordering.

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

Test-and-set atomique.

Remarque : si vous utilisez cette fonction dans une boucle, envisagez plutôt d’utiliser la surcharge avec l’argument supplémentaire « T &currentValue », ce qui évite l’appel supplémentaire à ` loadAcquire()` en cas d’échec.

Si la valeur actuelle de cette QAtomicInteger correspond à l’ expectedValue, les fonctions « test-and-set » attribuent l’ newValue à cette QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, cette fonction ne fait rien et renvoie false.

Cette fonction utilise la sémantique « ordonnée » ( memory ordering ), qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés.

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

Test-et-mise à zéro atomique.

Si la valeur actuelle de cette QAtomicInteger correspond à l’ expectedValue, les fonctions « test-and-set » attribuent l’ newValue à cette QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, elles chargent la valeur actuelle de cette QAtomicInteger dans currentValue et renvoient false.

Cette fonction utilise la sémantique « ordered » ( memory ordering ), qui garantit que les accès à la mémoire avant et après l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés. Si l’opération « test-and-set » échoue, la variable currentValue est chargée selon la sémantique « acquire » ( memory ordering ).

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

Test-and-set atomique.

Remarque : si vous utilisez cette fonction dans une boucle, envisagez plutôt d'utiliser la surcharge avec l'argument supplémentaire ` T &currentValue `, ce qui évite l'appel supplémentaire à ` loadRelaxed()` en cas d'échec.

Si la valeur actuelle de cet QAtomicInteger correspond à l’ expectedValue, les fonctions « test-and-set » attribuent l’ newValue à cet QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, cette fonction ne fait rien et renvoie false.

Cette fonction utilise une sémantique « relaxed » memory ordering, laissant au compilateur et au processeur la liberté de réorganiser les accès à la mémoire.

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

Test-and-set atomique.

Si la valeur actuelle de cette QAtomicInteger est celle de expectedValue, les fonctions « test-and-set » attribuent la valeur de newValue à cette QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, les fonctions chargent la valeur actuelle de cette QAtomicInteger dans currentValue et renvoient false.

Cette fonction utilise une sémantique « relaxed memory ordering », laissant au compilateur et au processeur la liberté de réorganiser les accès en mémoire. Si le test-and-set échoue, l’ currentValue est chargée selon la sémantique « relaxed memory ordering ».

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

Test-and-set atomique.

Remarque : si vous utilisez cette fonction dans une boucle, envisagez plutôt d’utiliser la surcharge avec l’argument supplémentaire ` T &currentValue `, ce qui évite l’appel supplémentaire à ` loadRelaxed()` en cas d’échec.

Si la valeur actuelle de cette QAtomicInteger est la expectedValue, les fonctions « test-and-set » attribuent la newValue à cette QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, cette fonction ne fait rien et renvoie false.

Cette fonction utilise la sémantique « release- memory ordering », qui garantit que les accès à la mémoire antérieurs à l’opération atomique (dans l’ordre du programme) ne peuvent pas être réordonnés après l’opération atomique.

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

Test-et-initialisation atomique.

Si la valeur actuelle de cette QAtomicInteger correspond à l’ expectedValue, les fonctions « test-and-set » attribuent la newValue à cette QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, les fonctions chargent la valeur actuelle de cette QAtomicInteger dans currentValue et renvoient false.

Cette fonction utilise la sémantique « release- memory ordering », qui garantit que les accès à la mémoire antérieurs à l’opération atomique (dans l’ordre du programme) ne peuvent pas être réorganisés après l’opération atomique. Si l’opération « test-and-set » échoue, la valeur de currentValue est chargée selon la sémantique « relaxed- memory ordering ».

QAtomicInteger::operator T() const

Charge de manière atomique la valeur de cet QAtomicInteger en utilisant, si possible, un ordre de mémoire séquentiellement cohérent ; sinon, l'ordre « Acquire ». La valeur n'est en aucun cas modifiée, mais notez qu'il n'y a aucune garantie qu'elle le reste.

Voir également ` loadRelaxed()` et ` loadAcquire()`.

T QAtomicInteger::operator&=(T value)

Opération atomique « add-and-fetch ».

Lit la valeur actuelle de cette QAtomicInteger, puis effectue un AND bit à bit entre value et la valeur actuelle, renvoyant ainsi la nouvelle valeur.

Cette fonction utilise, si possible, un ordre de mémoire séquentiellement cohérent ; sinon, elle utilise l’ordre « ordonné ».

Voir également fetchAndAndOrdered().

T QAtomicInteger::operator++()

Incrémente de manière atomique la valeur de cet élément « QAtomicInteger ». Renvoie la nouvelle valeur de cet élément atomique.

Cette fonction utilise un ordre de mémoire séquentiellement cohérent si possible ; sinon, elle utilise l’ordre « ordonné ».

Voir également ref(), operator++(int) et operator--().

T QAtomicInteger::operator++(int)

Incrémente de manière atomique la valeur de cet élément « QAtomicInteger ». Renvoie l'ancienne valeur de cet élément atomique.

Cette fonction utilise un ordre de mémoire séquentiellement cohérent si possible ; sinon, elle utilise l’ordre « Ordered ».

Voir également ref(), operator++() et operator--(int).

T QAtomicInteger::operator+=(T value)

Opération atomique « add-and-fetch ».

Lit la valeur actuelle de cette QAtomicInteger, puis ajoute value à la valeur actuelle, et renvoie la nouvelle valeur.

Cette fonction utilise un ordre de mémoire séquentiellement cohérent si possible ; sinon, elle utilise l’ordre « ordonné ».

Voir également fetchAndAddOrdered() et operator-=().

T QAtomicInteger::operator--()

Décrémente de manière atomique la valeur de cet élément « QAtomicInteger ». Renvoie la nouvelle valeur de cet élément atomique.

Cette fonction utilise un ordonnancement de mémoire séquentiellement cohérent si possible ; sinon, elle utilise l’ordonnancement « ordonné ».

Voir également deref(), operator--(int) et operator++().

T QAtomicInteger::operator--(int)

Décrémente de manière atomique la valeur de cet élément « QAtomicInteger ». Renvoie l'ancienne valeur de cet élément atomique.

Cette fonction utilise un ordre de mémoire séquentiellement cohérent si possible ; sinon, elle utilise l'ordre « ordonné ».

Voir également deref(), operator--() et operator++(int).

T QAtomicInteger::operator-=(T value)

Opération atomique « sub-and-fetch ».

Lit la valeur actuelle de cette é QAtomicInteger, puis soustrait value de cette valeur, et renvoie la nouvelle valeur.

Cette fonction utilise un ordre de mémoire séquentiellement cohérent si possible ; sinon, elle utilise l'ordre « ordonné ».

Voir également ` fetchAndSubOrdered()` et ` operator+=()`.

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

Enregistre de manière atomique l'autre valeur dans ce type atomique en utilisant, si possible, un ordre de mémoire séquentiellement cohérent ; sinon, l'ordre « Release ». Cette fonction renvoie une référence à cet objet.

Voir également storeRelaxed() et storeRelease().

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

Attribue la valeur « other » à « QAtomicInteger » et renvoie une référence à « QAtomicInteger ».

T QAtomicInteger::operator^=(T value)

Opération atomique « XOR et récupération ».

Lit la valeur actuelle de cette é QAtomicInteger, puis effectue une opération XOR bit à bit entre value et la valeur actuelle, et renvoie la nouvelle valeur.

Cette fonction utilise un ordre de mémoire séquentiellement cohérent si possible ; sinon, elle utilise l’ordre « ordonné ».

Voir également fetchAndXorOrdered().

T QAtomicInteger::operator|=(T value)

Opération atomique « OR-AND-FETCH ».

Lit la valeur actuelle de cette é QAtomicInteger, puis effectue une opération OR bit à bit entre value et la valeur actuelle, renvoyant ainsi la nouvelle valeur.

Cette fonction utilise un ordre de mémoire séquentiellement cohérent si possible ; sinon, elle utilise l’ordre « ordonné ».

Voir également fetchAndOrOrdered().

Éléments non membres associés

[noexcept, since 6.7] void qYieldCpu()

Suspend l'exécution du thread actuel pendant une durée indéterminée, à l'aide d'instructions matérielles, sans le retirer de la file d'attente. Cette fonction est destinée à être utilisée dans des boucles à haut débit où le code attend qu’un autre thread modifie une variable atomique. Elle est totalement différente de la fonction ` QThread::yieldCurrentThread()`, qui est une opération au niveau du système d’exploitation pouvant retirer le thread de la CPU et permettre à d’autres threads (appartenant éventuellement à d’autres processus) de s’exécuter.

Ainsi, au lieu de

while (!condition)
    ;

il faut écrire

while (!condition)
    qYieldCpu();

Ceci est utile aussi bien en présence qu’en l’absence de multithreading matériel sur le même cœur. Dans le cas des threads matériels, cela permet d’empêcher que l’exécution spéculative ne continue à saturer le pipeline, ce qui risquerait de priver le thread frère de ressources. Entre les cœurs et aux niveaux de séparation supérieurs, cela permet au protocole de cohérence du cache d’allouer la ligne de cache en cours de modification et d’inspection au processeur logique dont ce code attend le résultat.

Il est également recommandé d’encadrer de boucles le code qui ne modifie pas la variable globale, afin d’éviter les conflits d’accès lors de l’obtention exclusive de l’emplacement mémoire. Par conséquent, une boucle de modification atomique telle qu’une acquisition de spinlock devrait se présenter ainsi :

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

Sur les processeurs x86 et sur les processeurs RISC-V dotés de l’extension « Zihintpause », cela émettra l’instruction « PAUSE », qui est ignorée sur les processeurs ne la prenant pas en charge ; sur les processeurs ARMv7 ou ARM plus récents, cela émettra l’instruction « YIELD ».

Cette fonction a été introduite dans Qt 6.7.

Documentation sur les macros

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE

Cette macro est définie si et seulement si votre processeur prend en charge l'opération atomique « fetch-and-add » sur les entiers.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE

Cette macro est définie lorsque le matériel ne prend pas en charge les opérations « fetch-and-add » atomiques sur les entiers.

nn correspond à la taille de l’entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_SOMETIMES_NATIVE

Cette macro est définie lorsque seules certaines générations de processeurs prennent en charge l'opération atomique « fetch-and-add » sur les entiers. Utilisez la fonction ` QAtomicInteger::isFetchAndAddNative()` pour vérifier les fonctionnalités prises en charge par votre processeur.

nn correspond à la taille de l’entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE

Cette macro est définie conjointement avec Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE pour indiquer que l'opération atomique « fetch-and-add » sur les entiers est sans attente.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE

Cette macro est définie si et seulement si votre processeur prend en charge les opérations atomiques de lecture-écriture sur les entiers.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_NOT_NATIVE

Cette macro est définie lorsque le matériel ne prend pas en charge les opérations atomiques de lecture et d'écriture sur les entiers.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_SOMETIMES_NATIVE

Cette macro est définie lorsque seules certaines générations de processeurs prennent en charge les opérations atomiques de lecture-écriture sur les entiers. Utilisez la fonction ` QAtomicInteger::isFetchAndStoreNative()` pour vérifier les fonctionnalités prises en charge par votre processeur.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_WAIT_FREE

Cette macro est définie conjointement avec Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE pour indiquer que l'opération atomique « fetch-and-store » sur les entiers est sans attente.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_IS_SUPPORTED

Cette macro est définie si les entiers atomiques de taille nn (en bits) sont pris en charge par cette combinaison compilateur/architecture.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Les macros suivantes sont toujours définies :

  • Q_ATOMIC_INT8_IS_SUPPORTED
  • Q_ATOMIC_INT16_IS_SUPPORTED
  • Q_ATOMIC_INT32_IS_SUPPORTED

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE

Cette macro est définie si et seulement si toutes les générations de votre processeur prennent en charge le comptage atomique des références.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_NOT_NATIVE

Cette macro est définie lorsque le matériel ne prend pas en charge le comptage atomique des références.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE

Cette macro est définie lorsque seules certaines générations de processeurs prennent en charge le comptage atomique des références. Utilisez la fonction QAtomicInteger::isReferenceCountingNative() pour vérifier les fonctionnalités prises en charge par votre processeur.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_WAIT_FREE

Cette macro est définie conjointement avec ` Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE ` pour indiquer que le comptage des références est « sans attente ».

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE

Cette macro est définie si et seulement si votre processeur prend en charge l'opération atomique « test-and-set » sur les entiers.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_NOT_NATIVE

Cette macro est définie lorsque le matériel ne prend pas en charge l'opération « test-and-set » atomique sur les entiers.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_SOMETIMES_NATIVE

Cette macro est définie lorsque seules certaines générations de processeurs prennent en charge l'opération atomique « test-and-set » sur les entiers. Utilisez la fonction ` QAtomicInteger::isTestAndSetNative()` pour vérifier les fonctionnalités prises en charge par votre processeur.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_WAIT_FREE

Cette macro est définie conjointement avec Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE pour indiquer que l'opération atomique « test-and-set » sur les entiers est sans attente.

nn correspond à la taille de l'entier, en bits (8, 16, 32 ou 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.