QAtomicInteger Class
template <typename T> class QAtomicIntegerLa classe QAtomicInteger fournit des opérations atomiques indépendantes de la plate-forme sur les entiers. Plus d'informations...
| En-tête : | #include <QAtomicInteger> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Inherited By : |
- Liste de tous les membres, y compris les membres hérités
- QAtomicInteger fait partie de Threading Classes.
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 ¤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) |
| 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
| bool | isFetchAndAddNative() |
| bool | isFetchAndAddWaitFree() |
| bool | isFetchAndStoreNative() |
| bool | isFetchAndStoreWaitFree() |
| bool | isReferenceCountingNative() |
| bool | isReferenceCountingWaitFree() |
| bool | isTestAndSetNative() |
| bool | isTestAndSetWaitFree() |
Non-membres apparentés
(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 se termine sans interruption. La classe QAtomicInteger permet le comptage atomique de références, le test-and-set, le fetch-and-store et le fetch-and-add pour les entiers.
Le paramètre de modèle T doit être un type d'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, qint64, quint64
- taille spécifique à la plate-forme : long, unsigned long
- taille du pointeur : qintptr, quintptr, qptrdiff
Dans la liste ci-dessus, seules les instanciations de taille 8 bits, 16 bits, 32 bits et de taille de pointeur sont garanties de fonctionner sur toutes les plates-formes. 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 plates-formes 32 bits, consultez la macro Q_ATOMIC_INT64_IS_SUPPORTED.
L'API Atomic
Comptage de référence
Les fonctions ref() et deref() fournissent une API de comptage de références efficace. La valeur de retour de ces fonctions est utilisée pour indiquer quand la dernière référence a été libérée. Ces fonctions vous permettent d'implémenter vos propres classes implicitement partagées.
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; }
Ordonnancement 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'ordre 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 permettent une exécution hors ordre et un ordonnancement de la mémoire, il est nécessaire d'utiliser la bonne sémantique pour garantir que votre application fonctionne correctement sur tous les processeurs.
- Relaxed - l'ordre de la mémoire n'est pas spécifié, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire.
- Acquérir - l'accès à la mémoire qui suit l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné avant l'opération atomique.
- Release - l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné après l'opération atomique.
- Ordered - la même sémantique Acquire et Release combinée.
Test et réglage
Si la valeur actuelle du QAtomicInteger est une valeur attendue, les fonctions test-and-set attribuent une nouvelle valeur au QAtomicInteger et renvoient true. Si les valeurs ne sont pas identiques, ces fonctions ne font rien et renvoient false. Cette opération correspond 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.
Récupérer et stocker
Les fonctions d'extraction et de stockage atomiques lisent la valeur actuelle du QAtomicInteger, puis lui attribuent une nouvelle valeur, en renvoyant la valeur d'origine. Cette opération correspond au code suivant :
int originalValue = currentValue; currentValue = newValue; return originalValue;
Il existe 4 fonctions d'extraction et de stockage : fetchAndStoreRelaxed(), fetchAndStoreAcquire(), fetchAndStoreRelease() et fetchAndStoreOrdered(). Voir ci-dessus pour une explication des différentes sémantiques d'ordonnancement de la mémoire.
Récupérer et ajouter
Les fonctions d'extraction et d'ajout atomiques lisent la valeur actuelle du QAtomicInteger, puis ajoutent la valeur donnée à la valeur actuelle, en renvoyant la valeur d'origine. Cette opération correspond au code suivant :
int originalValue = currentValue; currentValue += valueToAdd; return originalValue;
Il existe 4 fonctions de récupération et d'ajout : fetchAndAddRelaxed(), fetchAndAddAcquire(), fetchAndAddRelease() et fetchAndAddOrdered(). Voir ci-dessus pour une explication des différentes sémantiques d'ordonnancement de la mémoire.
Tests de fonctionnalités pour l'API atomique
Fournir une API atomique indépendante de la plate-forme qui fonctionne sur tous les processeurs est un défi. L'API fournie par QAtomicInteger est garantie pour fonctionner de manière atomique sur tous les processeurs. Cependant, comme tous les processeurs ne prennent pas en charge toutes les 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 toujours, parfois ou pas du tout en charge une opération particulière. Les macros ont la forme Q_ATOMIC_INTnn_OPERATION_IS_HOW_NATIVE. nn est 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 se termine en temps constant est dite sans attente. De telles opérations ne sont pas mises en œuvre à l'aide de verrous ou de boucles de quelque nature que ce soit. Pour les opérations atomiques qui sont toujours supportées et qui sont sans attente, Qt définit Q_ATOMIC_INTnn_OPERATION_IS_WAIT_FREE en plus de Q_ATOMIC_INTnn_OPERATION_IS_ALWAYS_NATIVE.
Dans les cas où une opération atomique n'est supportée 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 supporte avec les 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 une liste complète de toutes les macros de caractéristiques 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_ET_SET_IS_ALWAYS_NATIVE
- Q_ATOMIC_INTnn_TEST_ET_SET_IS_SOMETIMES_NATIVE
- Q_ATOMIC_INTnn_TEST_ET_SET_IS_NOT_NATIVE
- Q_ATOMIC_INTnn_TEST_ET_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
Pour des raisons de compatibilité avec les versions précédentes de Qt, les macros avec un nn 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 des fonctions membres
[constexpr noexcept] QAtomicInteger::QAtomicInteger(T value = 0)
Construit un QAtomicInteger avec l'adresse value.
[noexcept] QAtomicInteger::QAtomicInteger(const QAtomicInteger<T> &other)
Construit une copie de other.
bool QAtomicInteger::deref()
Décrémente de façon atomique la valeur de ce QAtomicInteger. Elle renvoie true si la nouvelle valeur n'est pas nulle, false sinon.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
Voir également ref() et operator--().
T QAtomicInteger::fetchAndAddAcquire(T valueToAdd)
Récupération et ajout atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis ajoute valueToAdd à la valeur actuelle, en renvoyant la valeur originale.
Cette fonction utilise la sémantique acquire memory ordering, qui garantit que l'accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé avant l'opération atomique.
Voir également operator+=() et fetchAndSubAcquire().
T QAtomicInteger::fetchAndAddOrdered(T valueToAdd)
Récupération et ajout atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis ajoute valueToAdd à la valeur actuelle, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
Voir également operator+=() et fetchAndSubOrdered().
T QAtomicInteger::fetchAndAddRelaxed(T valueToAdd)
Récupération et ajout atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis ajoute valueToAdd à la valeur actuelle, en renvoyant la valeur originale.
Cette fonction utilise la sémantique relâchée de memory ordering, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire.
Voir également operator+=() et fetchAndSubRelaxed().
T QAtomicInteger::fetchAndAddRelease(T valueToAdd)
Récupération et ajout atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis ajoute valueToAdd à la valeur actuelle, en renvoyant la valeur originale.
Cette fonction utilise la sémantique release memory ordering, qui garantit que l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé après l'opération atomique.
Voir également operator+=() et fetchAndSubRelease().
T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)
Recherche atomique et-et.
Lit la valeur actuelle de ce QAtomicInteger, puis associe par bit à bit valueToAnd à la valeur actuelle, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique acquire memory ordering, qui garantit que l'accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé avant l'opération atomique.
Voir aussi operator&=().
T QAtomicInteger::fetchAndAndOrdered(T valueToAnd)
Recherche atomique et-et.
Lit la valeur actuelle de ce QAtomicInteger, puis associe par bit à bit valueToAnd à la valeur actuelle, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
Voir également operator&=().
T QAtomicInteger::fetchAndAndRelaxed(T valueToAnd)
Recherche atomique et-et.
Lit la valeur actuelle de ce QAtomicInteger, puis associe par bit à bit valueToAnd à la valeur actuelle et renvoie la valeur d'origine.
Cette fonction utilise la sémantique relâchée de memory ordering, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire.
Voir également operator&=().
T QAtomicInteger::fetchAndAndRelease(T valueToAnd)
Recherche atomique et-et.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue une opération de type bitwise-AND sur valueToAnd pour la valeur actuelle, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique release memory ordering, qui garantit que l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé après l'opération atomique.
Voir également operator&=().
T QAtomicInteger::fetchAndOrAcquire(T valueToOr)
Récupération atomique et-ou.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue un OU bit à bit entre valueToOr et la valeur actuelle, en renvoyant la valeur originale.
Cette fonction utilise la sémantique acquire memory ordering, qui garantit que l'accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé avant l'opération atomique.
Voir également operator|=().
T QAtomicInteger::fetchAndOrOrdered(T valueToOr)
Récupération atomique et-ou.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue un OU bit à bit de valueToOr à la valeur actuelle, en renvoyant la valeur originale.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
Voir également operator|=().
T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)
Récupération atomique et-ou.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue un OU bit à bit entre valueToOr et la valeur actuelle, en renvoyant la valeur originale.
Cette fonction utilise la sémantique relâchée de memory ordering, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire.
Voir également operator|=().
T QAtomicInteger::fetchAndOrRelease(T valueToOr)
Récupération atomique et-ou.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue un OU bit à bit entre valueToOr et la valeur actuelle, en renvoyant la valeur originale.
Cette fonction utilise la sémantique release memory ordering, qui garantit que l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé après l'opération atomique.
Voir également operator|=().
T QAtomicInteger::fetchAndStoreAcquire(T newValue)
Recherche et stockage atomiques.
Lit la valeur actuelle de ce QAtomicInteger et lui affecte le newValue, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique acquire memory ordering, qui garantit que l'accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé avant l'opération atomique.
T QAtomicInteger::fetchAndStoreOrdered(T newValue)
Recherche et stockage atomiques.
Lit la valeur actuelle de ce QAtomicInteger et lui attribue le newValue, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
T QAtomicInteger::fetchAndStoreRelaxed(T newValue)
Récupération et stockage atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis lui assigne le newValue, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique relâchée de memory ordering, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire.
T QAtomicInteger::fetchAndStoreRelease(T newValue)
Recherche et stockage atomiques.
Lit la valeur actuelle de ce QAtomicInteger et lui affecte le newValue, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique release memory ordering, qui garantit que l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé après l'opération atomique.
T QAtomicInteger::fetchAndSubAcquire(T valueToSub)
Récupération et soustraction atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis soustrait valueToSub à la valeur actuelle et renvoie la valeur originale.
Cette fonction utilise la sémantique acquire memory ordering, qui garantit que l'accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé avant l'opération atomique.
Voir également operator-=() et fetchAndAddAcquire().
T QAtomicInteger::fetchAndSubOrdered(T valueToSub)
Récupération et soustraction atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis soustrait valueToSub à la valeur actuelle et renvoie la valeur originale.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
Voir également operator-=() et fetchAndAddOrdered().
T QAtomicInteger::fetchAndSubRelaxed(T valueToSub)
Récupération et soustraction atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis soustrait valueToSub à la valeur actuelle et renvoie la valeur originale.
Cette fonction utilise la sémantique relâchée de memory ordering, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire.
Voir également operator-=() et fetchAndAddRelaxed().
T QAtomicInteger::fetchAndSubRelease(T valueToSub)
Récupération et soustraction atomiques.
Lit la valeur actuelle de ce QAtomicInteger, puis soustrait valueToSub à la valeur actuelle et renvoie la valeur originale.
Cette fonction utilise la sémantique release memory ordering, qui garantit que l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé après l'opération atomique.
Voir également operator-=() et fetchAndAddRelease().
T QAtomicInteger::fetchAndXorAcquire(T valueToXor)
Récupération atomique et XOR.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue un XOR bit à bit entre valueToXor et la valeur actuelle, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique acquire memory ordering, qui garantit que l'accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé avant l'opération atomique.
Voir également operator^=().
T QAtomicInteger::fetchAndXorOrdered(T valueToXor)
Récupération atomique et XOR.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue un XOR bit à bit entre valueToXor et la valeur actuelle, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
Voir également operator^=().
T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)
Récupération atomique et XOR.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue un XOR bit à bit entre valueToXor et la valeur actuelle, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique relâchée de memory ordering, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire.
Voir également operator^=().
T QAtomicInteger::fetchAndXorRelease(T valueToXor)
Récupération atomique et XOR.
Lit la valeur actuelle de ce QAtomicInteger, puis effectue un XOR bit à bit entre valueToXor et la valeur actuelle, en renvoyant la valeur d'origine.
Cette fonction utilise la sémantique release memory ordering, qui garantit que l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé après l'opération atomique.
Voir aussi operator^=().
[static constexpr] bool QAtomicInteger::isFetchAndAddNative()
Renvoie true si l'opération d'extraction et d'addition est mise en œuvre à l'aide d'instructions atomiques du processeur, false dans le cas contraire.
[static constexpr] bool QAtomicInteger::isFetchAndAddWaitFree()
Renvoie true si la recherche et l'ajout atomiques sont sans attente, false sinon.
[static constexpr] bool QAtomicInteger::isFetchAndStoreNative()
Renvoie true si la fonction d'extraction et de stockage est mise en œuvre à l'aide d'instructions atomiques du processeur, false dans le cas contraire.
[static constexpr] bool QAtomicInteger::isFetchAndStoreWaitFree()
Retourne true si la recherche et le stockage atomiques sont sans attente, false sinon.
[static constexpr] bool QAtomicInteger::isReferenceCountingNative()
Renvoie true si le comptage de références est mis en œuvre à l'aide d'instructions atomiques du processeur, false dans le cas contraire.
[static constexpr] bool QAtomicInteger::isReferenceCountingWaitFree()
Retourne true si le comptage atomique des références est sans attente, false sinon.
[static constexpr] bool QAtomicInteger::isTestAndSetNative()
Renvoie true si le test-et-set est mis en œuvre à l'aide d'instructions atomiques du processeur, false dans le cas contraire.
[static constexpr] bool QAtomicInteger::isTestAndSetWaitFree()
Retourne true si le test-et-ensemble atomique est sans attente, false sinon.
T QAtomicInteger::loadAcquire() const
Charge de manière atomique la valeur de ce site QAtomicInteger en utilisant la commande de mémoire "Acquire". La valeur n'est en aucun cas modifiée, mais il n'y a aucune garantie qu'elle le reste.
Voir aussi storeRelaxed() et loadRelaxed().
T QAtomicInteger::loadRelaxed() const
Charge de manière atomique la valeur de ce QAtomicInteger en utilisant un ordre de mémoire détendu. La valeur n'est en aucun cas modifiée, mais il n'y a aucune garantie qu'elle le reste.
Voir aussi storeRelaxed() et loadAcquire().
bool QAtomicInteger::ref()
Incrémente de façon atomique la valeur de cette QAtomicInteger. Elle renvoie true si la nouvelle valeur est différente de zéro, false dans le cas contraire.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
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 détendu.
Voir aussi storeRelease() et loadRelaxed().
void QAtomicInteger::storeRelease(T newValue)
La valeur newValue est stockée de manière atomique dans ce type atomique, en utilisant l'ordre de mémoire "Release".
Voir aussi storeRelaxed() et loadAcquire().
bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue)
Test et réglage atomiques.
Remarque : si vous utilisez cette fonction dans une boucle, envisagez d'utiliser la surcharge avec l'argument supplémentaire T ¤tValue, ce qui permet d'éviter l'ajout de loadAcquire() en cas d'échec.
Si la valeur actuelle de ce QAtomicInteger est le expectedValue, les fonctions test-and-set attribuent le newValue à ce QAtomicInteger et renvoient true. Si les valeurs sont différentes, cette fonction ne fait rien et renvoie false.
Cette fonction utilise la sémantique acquire memory ordering, qui garantit que l'accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé avant l'opération atomique.
bool QAtomicInteger::testAndSetAcquire(T expectedValue, T newValue, T ¤tValue)
Test-et-set atomique.
Si la valeur actuelle de ce QAtomicInteger est le expectedValue, les fonctions de test et de réglage attribuent le newValue à ce QAtomicInteger et renvoient le true. Si les valeurs sont différentes, les fonctions chargent la valeur actuelle de ce QAtomicInteger dans currentValue et renvoient false.
Cette fonction utilise la sémantique " acquire memory ordering ", qui garantit que l'accès à la mémoire suivant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé avant l'opération atomique. Si le test et la mise en place échouent, l'adresse currentValue est chargée avec la sémantique " acquire memory ordering ".
bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue)
Test et réglage atomiques.
Remarque : si vous utilisez cette fonction dans une boucle, envisagez plutôt d'utiliser la surcharge avec l'argument supplémentaire T ¤tValue, ce qui permet d'éviter l'ajout de loadAcquire() en cas d'échec.
Si la valeur actuelle de ce QAtomicInteger est le expectedValue, les fonctions test-and-set attribuent le newValue à ce QAtomicInteger et renvoient true. Si les valeurs sont différentes, cette fonction ne fait rien et renvoie false.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné.
bool QAtomicInteger::testAndSetOrdered(T expectedValue, T newValue, T ¤tValue)
Test-et-set atomique.
Si la valeur actuelle de ce QAtomicInteger est le expectedValue, les fonctions test-and-set attribuent le newValue à ce QAtomicInteger et renvoient le true. Si les valeurs sont différentes, elle charge la valeur actuelle de QAtomicInteger dans currentValue et renvoie false.
Cette fonction utilise la sémantique memory ordering ordonnée, qui garantit que l'accès à la mémoire avant et après l'opération atomique (dans l'ordre du programme) ne peut pas être réordonné. Si le test et la mise en place échouent, currentValue est chargé avec la sémantique " acquire memory ordering ".
bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue)
Test et réglage atomiques.
Remarque : si vous utilisez cette fonction dans une boucle, envisagez d'utiliser la surcharge avec l'argument supplémentaire T ¤tValue, ce qui permet d'éviter l'ajout de loadRelaxed() en cas d'échec.
Si la valeur actuelle de ce QAtomicInteger est le expectedValue, les fonctions test-and-set attribuent le newValue à ce QAtomicInteger et renvoient true. Si les valeurs sont différentes, cette fonction ne fait rien et renvoie false.
Cette fonction utilise la sémantique relâchée de memory ordering, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire.
bool QAtomicInteger::testAndSetRelaxed(T expectedValue, T newValue, T ¤tValue)
Test-et-set atomique.
Si la valeur actuelle de ce QAtomicInteger est le expectedValue, les fonctions de test et de réglage attribuent le newValue à ce QAtomicInteger et renvoient le true. Si les valeurs sont différentes, les fonctions chargent la valeur actuelle de ce QAtomicInteger dans currentValue et renvoient false.
Cette fonction utilise la sémantique relâchée de memory ordering, ce qui permet au compilateur et au processeur de réorganiser librement les accès à la mémoire. Si le test et le réglage échouent, la valeur de currentValue est chargée avec la sémantique relâchée de memory ordering.
bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue)
Test et réglage atomiques.
Remarque : si vous utilisez cette fonction dans une boucle, envisagez d'utiliser la surcharge avec l'argument supplémentaire T ¤tValue, ce qui permet d'éviter l'ajout de loadRelaxed() en cas d'échec.
Si la valeur actuelle de ce QAtomicInteger est le expectedValue, les fonctions test-and-set attribuent le newValue à ce QAtomicInteger et renvoient true. Si les valeurs sont différentes, cette fonction ne fait rien et renvoie false.
Cette fonction utilise la sémantique release memory ordering, qui garantit que l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé après l'opération atomique.
bool QAtomicInteger::testAndSetRelease(T expectedValue, T newValue, T ¤tValue)
Test-et-set atomique.
Si la valeur actuelle de ce QAtomicInteger est le expectedValue, les fonctions test-and-set attribuent le newValue à ce QAtomicInteger et renvoient le true. Si les valeurs sont différentes, les fonctions chargent la valeur actuelle de QAtomicInteger dans currentValue et renvoient false.
Cette fonction utilise la sémantique release memory ordering, qui garantit que l'accès à la mémoire avant l'opération atomique (dans l'ordre du programme) ne peut pas être réorganisé après l'opération atomique. Si le test et la mise en place échouent, currentValue est chargé avec la sémantique relaxée memory ordering.
QAtomicInteger::operator T() const
Charge de manière atomique la valeur de ce site QAtomicInteger en utilisant un ordre de mémoire séquentiellement cohérent si possible ; ou l'ordre "Acquire" si ce n'est pas le cas. La valeur n'est en aucun cas modifiée, mais il n'y a aucune garantie qu'elle le reste.
Voir aussi loadRelaxed() et loadAcquire().
T QAtomicInteger::operator&=(T value)
Ajout et récupération atomiques.
Lit la valeur actuelle de ce site QAtomicInteger, puis associe par bitcoins value à la valeur actuelle et renvoie la nouvelle valeur.
Cette fonction utilise un ordre séquentiel cohérent de la mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir aussi fetchAndAndOrdered().
T QAtomicInteger::operator++()
Pré-augmente de façon atomique la valeur de ce QAtomicInteger. Renvoie la nouvelle valeur de cet atome.
Cette fonction utilise un ordre séquentiel cohérent en mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir également ref(), operator++(int) et operator--().
T QAtomicInteger::operator++(int)
Post-incrémentation atomique de la valeur de cette QAtomicInteger. Renvoie l'ancienne valeur de cet atome.
Cette fonction utilise un ordre séquentiel cohérent en mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir également ref(), operator++() et operator--(int).
T QAtomicInteger::operator+=(T value)
Ajout et récupération atomiques.
Lit la valeur actuelle de ce site QAtomicInteger, puis ajoute value à la valeur actuelle et renvoie la nouvelle valeur.
Cette fonction utilise un ordre séquentiel cohérent en mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir aussi fetchAndAddOrdered() et operator-=().
T QAtomicInteger::operator--()
Prédécrémente de manière atomique la valeur de cette QAtomicInteger. Renvoie la nouvelle valeur de cet atome.
Cette fonction utilise un ordre séquentiel cohérent en mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir également deref(), operator--(int) et operator++().
T QAtomicInteger::operator--(int)
Post-décrémente de manière atomique la valeur de cette QAtomicInteger. Renvoie l'ancienne valeur de cet atome.
Cette fonction utilise un ordre séquentiel cohérent en mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir aussi deref(), operator--() et operator++(int).
T QAtomicInteger::operator-=(T value)
Sous-échantillon atomique.
Lit la valeur actuelle de ce site QAtomicInteger, puis soustrait value à la valeur actuelle et renvoie la nouvelle valeur.
Cette fonction utilise un ordre séquentiel cohérent en mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir aussi fetchAndSubOrdered() et operator+=().
QAtomicInteger<T> &QAtomicInteger::operator=(T)
Enregistre de manière atomique l'autre valeur dans ce type atomique en utilisant un ordre de mémoire séquentiellement cohérent si possible ; ou un ordre "Release" si ce n'est pas le cas. Cette fonction renvoie une référence à cet objet.
Voir également storeRelaxed() et storeRelease().
[noexcept] QAtomicInteger<T> &QAtomicInteger::operator=(const QAtomicInteger<T> &other)
Attribue other à QAtomicInteger et renvoie une référence à QAtomicInteger.
T QAtomicInteger::operator^=(T value)
xor-and-fetch atomique.
Lit la valeur actuelle de ce site QAtomicInteger, puis effectue un XOR bit à bit entre value et la valeur actuelle, en renvoyant la nouvelle valeur.
Cette fonction utilise un ordre séquentiel cohérent de la mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir aussi fetchAndXorOrdered().
T QAtomicInteger::operator|=(T value)
Ou-et-fetch atomique.
Lit la valeur actuelle de ce site QAtomicInteger, puis effectue un OU bit à bit entre value et la valeur actuelle, et renvoie la nouvelle valeur.
Cette fonction utilise un ordre séquentiel cohérent en mémoire si possible, ou un ordre "ordonné" si ce n'est pas le cas.
Voir également fetchAndOrOrdered().
Non-membres apparentés
[noexcept, since 6.7] void qYieldCpu()
Met en pause l'exécution du thread courant pendant un temps non spécifié, en utilisant des instructions matérielles, sans désordonner ce thread. Cette fonction est destinée à être utilisée dans les boucles à haut débit où le code s'attend à ce qu'un autre thread modifie une variable atomique. Cette fonction est complètement différente de QThread::yieldCurrentThread(), qui est une opération au niveau du système d'exploitation qui peut retirer le thread entier de l'unité centrale 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 à la fois avec et sans multithreading matériel sur le même cœur. Dans le cas des threads matériels, elle permet d'éviter que d'autres exécutions spéculatives ne remplissent le pipeline, ce qui pourrait priver le thread frère de ressources. Entre les cœurs et les niveaux de séparation plus élevés, cela permet au protocole de cohérence du cache d'allouer la ligne de cache modifiée et inspectée au processeur logique dont le résultat est attendu par ce code.
Il est également recommandé de boucler autour d'un code qui ne modifie pas la variable globale, afin d'éviter les conflits liés à l'obtention exclusive de l'emplacement en mémoire. Par conséquent, une boucle de modification atomique telle que l'acquisition d'un spinlock devrait être utilisée :
while (true) { while (!readOnlyCondition(atomic)) qYieldCpu(); if (modify(atomic)) break; }
Sur les processeurs x86 et sur les processeurs RISC-V avec l'extension Zihintpause, cela émettra l'instruction PAUSE, qui est ignorée sur les processeurs qui ne la supportent pas ; sur les processeurs ARMv7 ou 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 supporte le fetch-and-add atomique sur les entiers.
nn est 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 l'extraction et l'ajout atomiques d'entiers.
nn est 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'extraction et l'ajout atomiques d'entiers. Utilisez la fonction QAtomicInteger::isFetchAndAddNative() pour vérifier ce que votre processeur supporte.
nn est 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 avec Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE pour indiquer que l'extraction et l'ajout atomiques d'entiers sont sans attente.
nn est 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 supporte le fetch-and-store atomique sur les entiers.
nn est 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 l'extraction et le stockage atomiques sur les entiers.
nn est 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 l'extraction et le stockage atomiques d'entiers. Utilisez la fonction QAtomicInteger::isFetchAndStoreNative() pour vérifier ce que votre processeur supporte.
nn est 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 avec Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE pour indiquer que l'extraction et le stockage atomique sur les entiers est sans attente.
nn est 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 dans cette combinaison compilateur/architecture.
nn est 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 supportent le comptage atomique de références.
nn est 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 supporte pas le comptage atomique des références.
nn est 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 du processeur prennent en charge le comptage atomique des références. Utilisez la fonction QAtomicInteger::isReferenceCountingNative() pour vérifier ce que votre processeur supporte.
nn est 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 avec Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE pour indiquer que le comptage de référence est sans attente.
nn est 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 supporte le test atomique et le set sur les entiers.
nn est 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 le test atomique et le set sur les entiers.
nn est 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 le test atomique et la définition des entiers. Utilisez la fonction QAtomicInteger::isTestAndSetNative() pour vérifier ce que votre processeur supporte.
nn est 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 avec Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE pour indiquer que le test-et-ensemble atomique sur les entiers est sans attente.
nn est 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.