En esta página

QAtomicInteger Class

template <typename T> class QAtomicInteger

La clase QAtomicInteger proporciona operaciones atómicas independientes de la plataforma sobre enteros. Más...

Cabecera: #include <QAtomicInteger>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Heredado Por:

QAtomicInt

Funciones Públicas

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)

Miembros públicos estáticos

(since 6.7) void qYieldCpu()

Macros

Descripción Detallada

Para operaciones atómicas sobre punteros, véase la clase QAtomicPointer.

Una operación atómica es una operación compleja que se completa sin interrupción. La clase QAtomicInteger proporciona conteo atómico de referencias, test-and-set, fetch-and-store, y fetch-and-add para enteros.

El parámetro de plantilla T debe ser un tipo entero de 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
  • tamaño específico de la plataforma: long, unsigned long
  • tamaño de puntero: qintptr, quintptr, qptrdiff

De la lista anterior, sólo se garantiza que las instancias de 8 bits, 16 bits, 32 bits y tamaño puntero funcionen en todas las plataformas. La compatibilidad con otros tamaños depende del compilador y de la arquitectura del procesador para la que se compile el código. Para comprobar si los tipos de 64 bits son compatibles con plataformas de 32 bits, consulte la macro Q_ATOMIC_INT64_IS_SUPPORTED.

La API atómica

Recuento de referencias

Las funciones ref() y deref() proporcionan una eficiente API de recuento de referencias. El valor de retorno de estas funciones se utiliza para indicar cuándo se ha liberado la última referencia. Estas funciones le permiten implementar sus propias clases compartidas implícitamente.

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

Ordenación de la memoria

QAtomicInteger proporciona varias implementaciones de las funciones atómicas test-and-set, fetch-and-store y fetch-and-add. Cada implementación define una semántica de ordenación de memoria que describe cómo el procesador ejecuta los accesos a memoria que rodean a la instrucción atómica. Dado que muchas arquitecturas modernas permiten la ejecución fuera de orden y el ordenamiento de memoria, es necesario utilizar la semántica correcta para garantizar que su aplicación funcione correctamente en todos los procesadores.

  • Relajado - el orden de memoria no está especificado, dejando que el compilador y el procesador reordenen libremente los accesos a memoria.
  • Acquire - el acceso a memoria que sigue a la operación atómica (en el orden del programa) no puede ser reordenado antes de la operación atómica.
  • Release - el acceso a la memoria antes de la operación atómica (en el orden del programa) no puede ser reordenado después de la operación atómica.
  • Ordered - la misma semántica de Acquire y Release combinada.

Test-and-set

Si el valor actual del QAtomicInteger es un valor esperado, las funciones test-and-set asignan un nuevo valor al QAtomicInteger y devuelven true. Si los valores no coinciden, estas funciones no hacen nada y devuelven false. Esta operación equivale al siguiente código:

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

Existen 4 funciones test-and-set: testAndSetRelaxed(), testAndSetAcquire(), testAndSetRelease(), y testAndSetOrdered(). Véase más arriba la explicación de las diferentes semánticas de ordenación de la memoria.

Obtención y almacenamiento

Las funciones atómicas fetch-and-store leen el valor actual del QAtomicInteger y luego asignan un nuevo valor, devolviendo el valor original. Esta operación equivale al siguiente código:

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

Existen 4 funciones fetch-and-store: fetchAndStoreRelaxed(), fetchAndStoreAcquire(), fetchAndStoreRelease(), y fetchAndStoreOrdered(). Véase más arriba la explicación de las diferentes semánticas de ordenación de memoria.

Obtención y adición

Las funciones atómicas fetch-and-add leen el valor actual del QAtomicInteger y luego añaden el valor dado al valor actual, devolviendo el valor original. Esta operación equivale al siguiente código:

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

Hay 4 funciones fetch-and-add: fetchAndAddRelaxed(), fetchAndAddAcquire(), fetchAndAddRelease(), y fetchAndAddOrdered(). Véase más arriba la explicación de las diferentes semánticas de ordenación de la memoria.

Pruebas de funcionamiento de la API atómica

Proporcionar una API atómica independiente de la plataforma que funcione en todos los procesadores es un reto. La API proporcionada por QAtomicInteger garantiza el funcionamiento atómico en todos los procesadores. Sin embargo, dado que no todos los procesadores implementan soporte para cada operación proporcionada por QAtomicInteger, es necesario exponer información sobre el procesador.

Puedes comprobar en tiempo de compilación qué funciones están soportadas en tu hardware utilizando varias macros. Estas te dirán si tu hardware siempre, a veces, o no soporta una operación en particular. Las macros tienen la forma Q_ATOMIC_INTnn_OPERATION_IS_HOW_NATIVE. nn es el tamaño del entero (en bits), OPERATION es una de REFERENCE_COUNTING, TEST_AND_SET, FETCH_AND_STORE, o FETCH_AND_ADD, y HOW es una de SIEMPRE, A VECES, o NO. Siempre habrá exactamente una macro definida por operación. Por ejemplo, si se define Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVE, no se definirán ni Q_ATOMIC_INT_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE ni Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_NOT_NATIVE.

Una operación que se completa en tiempo constante se dice que no requiere espera. Tales operaciones no se implementan utilizando bloqueos o bucles de ningún tipo. Para las operaciones atómicas que se soportan siempre, y que son wait-free, Qt define Q_ATOMIC_INTnn_OPERATION_IS_WAIT_FREE además de Q_ATOMIC_INTnn_OPERATION_IS_ALWAYS_NATIVE.

En los casos en que una operación atómica sólo está soportada en las nuevas generaciones del procesador, QAtomicInteger también proporciona una forma de comprobar en tiempo de ejecución lo que soporta su hardware con las funciones isReferenceCountingNative(), isTestAndSetNative(), isFetchAndStoreNative(), y isFetchAndAddNative(). Las implementaciones sin espera pueden detectarse mediante las funciones isReferenceCountingWaitFree(), isTestAndSetWaitFree(), isFetchAndStoreWaitFree(), y isFetchAndAddWaitFree().

A continuación se muestra una lista completa de todas las macros de funciones para 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

Por compatibilidad con versiones anteriores de Qt, las macros con un nn vacío son equivalentes a las macros de 32 bits. Por ejemplo, Q_ATOMIC_INT_REFERENCE_COUNTING_IS_WAIT_FREE es lo mismo que Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_WAIT_FREE.

Véase también QAtomicPointer.

Documentación de las funciones miembro

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

Construye un QAtomicInteger con la dirección value.

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

Construye una copia de other.

bool QAtomicInteger::deref()

Disminuye atómicamente el valor de este QAtomicInteger. Devuelve true si el nuevo valor es distinto de cero, false en caso contrario.

Esta función utiliza la semántica ordenada memory ordering, que asegura que el acceso a memoria antes y después de la operación atómica (en el orden del programa) no puede ser reordenado.

Véase también ref() y operator--().

T QAtomicInteger::fetchAndAddAcquire(T valueToAdd)

Obtención y adición atómicas.

Lee el valor actual de este QAtomicInteger y luego añade valueToAdd al valor actual, devolviendo el valor original.

Esta función utiliza la semántica de adquisición memory ordering, que garantiza que el acceso a memoria que sigue a la operación atómica (en el orden del programa) no puede reordenarse antes de la operación atómica.

Véase también operator+=() y fetchAndSubAcquire().

T QAtomicInteger::fetchAndAddOrdered(T valueToAdd)

Obtención y adición atómicas.

Lee el valor actual de este QAtomicInteger y luego añade valueToAdd al valor actual, devolviendo el valor original.

Esta función utiliza la semántica ordenada de memory ordering, que garantiza que el acceso a la memoria antes y después de la operación atómica (en el orden del programa) no puede reordenarse.

Véase también operator+=() y fetchAndSubOrdered().

T QAtomicInteger::fetchAndAddRelaxed(T valueToAdd)

Obtención y adición atómicas.

Lee el valor actual de este QAtomicInteger y luego añade valueToAdd al valor actual, devolviendo el valor original.

Esta función utiliza la semántica relajada de memory ordering, dejando que el compilador y el procesador reordenen libremente los accesos a memoria.

Véase también operator+=() y fetchAndSubRelaxed().

T QAtomicInteger::fetchAndAddRelease(T valueToAdd)

Obtención y adición atómicas.

Lee el valor actual de este QAtomicInteger y luego añade valueToAdd al valor actual, devolviendo el valor original.

Esta función utiliza la semántica release memory ordering, que garantiza que los accesos a memoria anteriores a la operación atómica (en el orden del programa) no puedan reordenarse después de la operación atómica.

Véase también operator+=() y fetchAndSubRelease().

T QAtomicInteger::fetchAndAndAcquire(T valueToAnd)

Atomic fetch-and-and.

Lee el valor actual de este QAtomicInteger y luego bitwise-ANDs valueToAnd al valor actual, devolviendo el valor original.

Esta función utiliza la semántica de adquisición memory ordering, que asegura que el acceso a memoria que sigue a la operación atómica (en el orden del programa) no puede ser reordenado antes de la operación atómica.

Véase también operator&=().

T QAtomicInteger::fetchAndAndOrdered(T valueToAnd)

Atomic fetch-and-and.

Lee el valor actual de este QAtomicInteger y luego bitwise-ANDs valueToAnd al valor actual, devolviendo el valor original.

Esta función utiliza la semántica ordenada de memory ordering, que garantiza que el acceso a la memoria antes y después de la operación atómica (en el orden del programa) no puede reordenarse.

Véase también operator&=().

T QAtomicInteger::fetchAndAndRelaxed(T valueToAnd)

Atomic fetch-and-and.

Lee el valor actual de este QAtomicInteger y luego bitwise-ANDs valueToAnd al valor actual, devolviendo el valor original.

Esta función utiliza la semántica relajada de memory ordering, permitiendo al compilador y al procesador reordenar libremente los accesos a memoria.

Véase también operator&=().

T QAtomicInteger::fetchAndAndRelease(T valueToAnd)

Atomic fetch-and-and.

Lee el valor actual de este QAtomicInteger y luego bitwise-ANDs valueToAnd al valor actual, devolviendo el valor original.

Esta función utiliza la semántica release memory ordering, que asegura que el acceso a memoria antes de la operación atómica (en el orden del programa) no puede ser reordenado después de la operación atómica.

Véase también operator&=().

T QAtomicInteger::fetchAndOrAcquire(T valueToOr)

Búsqueda atómica y O.

Lee el valor actual de este QAtomicInteger y luego bitwise-ORs valueToOr al valor actual, devolviendo el valor original.

Esta función utiliza la semántica acquire memory ordering, que garantiza que el acceso a memoria que sigue a la operación atómica (en el orden del programa) no puede reordenarse antes de la operación atómica.

Véase también operator|=().

T QAtomicInteger::fetchAndOrOrdered(T valueToOr)

Búsqueda atómica y O.

Lee el valor actual de este QAtomicInteger y luego bitwise-ORs valueToOr al valor actual, devolviendo el valor original.

Esta función utiliza la semántica ordenada de memory ordering, que garantiza que el acceso a la memoria antes y después de la operación atómica (en el orden del programa) no puede reordenarse.

Véase también operator|=().

T QAtomicInteger::fetchAndOrRelaxed(T valueToOr)

Búsqueda atómica y O.

Lee el valor actual de este QAtomicInteger y luego bitwise-ORs valueToOr al valor actual, devolviendo el valor original.

Esta función utiliza la semántica relajada de memory ordering, permitiendo al compilador y al procesador reordenar libremente los accesos a memoria.

Véase también operator|=().

T QAtomicInteger::fetchAndOrRelease(T valueToOr)

Búsqueda atómica y O.

Lee el valor actual de este QAtomicInteger y luego bitwise-ORs valueToOr al valor actual, devolviendo el valor original.

Esta función utiliza la semántica release memory ordering, que garantiza que el acceso a la memoria antes de la operación atómica (en el orden del programa) no puede reordenarse después de la operación atómica.

Véase también operator|=().

T QAtomicInteger::fetchAndStoreAcquire(T newValue)

Búsqueda y almacenamiento atómicos.

Lee el valor actual de este QAtomicInteger y luego le asigna el newValue, devolviendo el valor original.

Esta función utiliza la semántica acquire memory ordering, que garantiza que el acceso a la memoria que sigue a la operación atómica (en el orden del programa) no puede reordenarse antes de la operación atómica.

T QAtomicInteger::fetchAndStoreOrdered(T newValue)

Búsqueda y almacenamiento atómicos.

Lee el valor actual de este QAtomicInteger y luego le asigna el newValue, devolviendo el valor original.

Esta función utiliza la semántica memory ordering ordenada, que garantiza que el acceso a la memoria antes y después de la operación atómica (en el orden del programa) no puede reordenarse.

T QAtomicInteger::fetchAndStoreRelaxed(T newValue)

Búsqueda y almacenamiento atómicos.

Lee el valor actual de este QAtomicInteger y luego le asigna el newValue, devolviendo el valor original.

Esta función utiliza una semántica relajada de memory ordering, lo que permite al compilador y al procesador reordenar libremente los accesos a la memoria.

T QAtomicInteger::fetchAndStoreRelease(T newValue)

Búsqueda y almacenamiento atómicos.

Lee el valor actual de este QAtomicInteger y luego le asigna el newValue, devolviendo el valor original.

Esta función utiliza la semántica release memory ordering, que garantiza que el acceso a la memoria antes de la operación atómica (en el orden del programa) no puede reordenarse después de la operación atómica.

T QAtomicInteger::fetchAndSubAcquire(T valueToSub)

Obtención y sustracción atómica.

Lee el valor actual de este QAtomicInteger y luego resta valueToSub al valor actual, devolviendo el valor original.

Esta función utiliza la semántica de adquisición memory ordering, que garantiza que el acceso a memoria que sigue a la operación atómica (en el orden del programa) no puede reordenarse antes de la operación atómica.

Véase también operator-=() y fetchAndAddAcquire().

T QAtomicInteger::fetchAndSubOrdered(T valueToSub)

Obtención y sustracción atómica.

Lee el valor actual de este QAtomicInteger y luego resta valueToSub al valor actual, devolviendo el valor original.

Esta función utiliza la semántica ordenada de memory ordering, que garantiza que el acceso a la memoria antes y después de la operación atómica (en el orden del programa) no puede reordenarse.

Véase también operator-=() y fetchAndAddOrdered().

T QAtomicInteger::fetchAndSubRelaxed(T valueToSub)

Obtención y sustracción atómica.

Lee el valor actual de este QAtomicInteger y luego resta valueToSub al valor actual, devolviendo el valor original.

Esta función utiliza la semántica relajada de memory ordering, dejando que el compilador y el procesador reordenen libremente los accesos a memoria.

Véase también operator-=() y fetchAndAddRelaxed().

T QAtomicInteger::fetchAndSubRelease(T valueToSub)

Obtención y sustracción atómica.

Lee el valor actual de este QAtomicInteger y luego resta valueToSub al valor actual, devolviendo el valor original.

Esta función utiliza la semántica release memory ordering, que garantiza que los accesos a memoria anteriores a la operación atómica (en el orden del programa) no puedan reordenarse después de la operación atómica.

Véase también operator-=() y fetchAndAddRelease().

T QAtomicInteger::fetchAndXorAcquire(T valueToXor)

Búsqueda atómica y XOR.

Lee el valor actual de este QAtomicInteger y luego bitwise-XORs valueToXor al valor actual, devolviendo el valor original.

Esta función utiliza la semántica de adquisición memory ordering, que asegura que el acceso a memoria que sigue a la operación atómica (en el orden del programa) no puede ser reordenado antes de la operación atómica.

Véase también operator^=().

T QAtomicInteger::fetchAndXorOrdered(T valueToXor)

Búsqueda atómica y XOR.

Lee el valor actual de este QAtomicInteger y luego bitwise-XORs valueToXor al valor actual, devolviendo el valor original.

Esta función utiliza la semántica ordenada de memory ordering, que garantiza que el acceso a la memoria antes y después de la operación atómica (en el orden del programa) no puede reordenarse.

Véase también operator^=().

T QAtomicInteger::fetchAndXorRelaxed(T valueToXor)

Búsqueda atómica y XOR.

Lee el valor actual de este QAtomicInteger y luego bitwise-XORs valueToXor al valor actual, devolviendo el valor original.

Esta función utiliza una semántica relajada de memory ordering, permitiendo al compilador y al procesador reordenar libremente los accesos a memoria.

Véase también operator^=().

T QAtomicInteger::fetchAndXorRelease(T valueToXor)

Búsqueda atómica y XOR.

Lee el valor actual de este QAtomicInteger y luego bitwise-XORs valueToXor al valor actual, devolviendo el valor original.

Esta función utiliza la semántica release memory ordering, que asegura que el acceso a memoria antes de la operación atómica (en el orden del programa) no puede ser reordenado después de la operación atómica.

Véase también operator^=().

[static constexpr] bool QAtomicInteger::isFetchAndAddNative()

Devuelve true si fetch-and-add se implementa utilizando instrucciones atómicas del procesador, false en caso contrario.

[static constexpr] bool QAtomicInteger::isFetchAndAddWaitFree()

Devuelve true si la función atomic fetch-and-add es wait-free, false en caso contrario.

[static constexpr] bool QAtomicInteger::isFetchAndStoreNative()

Devuelve true si fetch-and-store se implementa utilizando instrucciones atómicas del procesador, false en caso contrario.

[static constexpr] bool QAtomicInteger::isFetchAndStoreWaitFree()

Devuelve true si la función atomic fetch-and-store es wait-free, false en caso contrario.

[static constexpr] bool QAtomicInteger::isReferenceCountingNative()

Devuelve true si el conteo de referencias se implementa utilizando instrucciones atómicas del procesador, false en caso contrario.

[static constexpr] bool QAtomicInteger::isReferenceCountingWaitFree()

Devuelve true si el recuento de referencias atómicas está libre de esperas, false en caso contrario.

[static constexpr] bool QAtomicInteger::isTestAndSetNative()

Devuelve true si test-and-set se implementa utilizando instrucciones atómicas del procesador, false en caso contrario.

[static constexpr] bool QAtomicInteger::isTestAndSetWaitFree()

Devuelve true si atomic test-and-set es wait-free, false en caso contrario.

T QAtomicInteger::loadAcquire() const

Carga atómicamente el valor de este QAtomicInteger utilizando la ordenación de memoria "Adquirir". El valor no se modifica de ninguna manera, pero ten en cuenta que no hay garantía de que permanezca así.

Véase también storeRelaxed() y loadRelaxed().

T QAtomicInteger::loadRelaxed() const

Carga atómicamente el valor de este QAtomicInteger utilizando un orden de memoria relajado. El valor no se modifica de ninguna manera, pero ten en cuenta que no hay garantía de que permanezca así.

Véase también storeRelaxed() y loadAcquire().

bool QAtomicInteger::ref()

Incrementa atómicamente el valor de este QAtomicInteger. Devuelve true si el nuevo valor es distinto de cero, false en caso contrario.

Esta función utiliza la semántica ordenada memory ordering, que asegura que el acceso a memoria antes y después de la operación atómica (en el orden del programa) no puede ser reordenado.

Véase también deref() y operator++().

void QAtomicInteger::storeRelaxed(T newValue)

Almacena atómicamente el valor newValue en este tipo atómico, utilizando un orden de memoria relajado.

Véase también storeRelease() y loadRelaxed().

void QAtomicInteger::storeRelease(T newValue)

Almacena atómicamente el valor newValue en este tipo atómico, utilizando la ordenación de memoria "Release".

Véase también storeRelaxed() y loadAcquire().

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

Prueba atómica.

Nota: Si utiliza esta función en un bucle, considere utilizar en su lugar la sobrecarga con el argumento adicional T &currentValue, que evita el extra loadAcquire() en caso de fallo.

Si el valor actual de este QAtomicInteger es el expectedValue, las funciones test-and-set asignan el newValue a este QAtomicInteger y devuelven true. Si los valores no son iguales, esta función no hace nada y devuelve false.

Esta función utiliza la semántica de adquirir memory ordering, que asegura que el acceso a memoria que sigue a la operación atómica (en el orden del programa) no puede ser reordenado antes de la operación atómica.

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

Test-and-set atómico.

Si el valor actual de este QAtomicInteger es el expectedValue, las funciones test-and-set asignan el newValue a este QAtomicInteger y devuelven true. Si los valores no son los mismos, las funciones cargan el valor actual de este QAtomicInteger en currentValue y devuelven false.

Esta función utiliza la semántica acquire memory ordering, que garantiza que el acceso a la memoria que sigue a la operación atómica (en el orden del programa) no puede reordenarse antes de la operación atómica. Si el test-and-set falla, el currentValue se carga con la semántica acquire memory ordering.

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

Prueba atómica.

Nota: Si utiliza esta función en un bucle, considere utilizar en su lugar la sobrecarga con el argumento adicional T &currentValue, que evita el extra loadAcquire() en caso de fallo.

Si el valor actual de este QAtomicInteger es el expectedValue, las funciones test-and-set asignan el newValue a este QAtomicInteger y devuelven true. Si los valores no son iguales, esta función no hace nada y devuelve false.

Esta función utiliza la semántica memory ordering ordenada, que garantiza que el acceso a la memoria antes y después de la operación atómica (en el orden del programa) no puede reordenarse.

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

Test-and-set atómico.

Si el valor actual de este QAtomicInteger es el expectedValue, las funciones test-and-set asignan el newValue a este QAtomicInteger y devuelven true. Si los valores no son iguales, carga el valor actual de este QAtomicInteger en currentValue y devuelve false.

Esta función utiliza la semántica memory ordering ordenada, que garantiza que el acceso a la memoria antes y después de la operación atómica (en el orden del programa) no puede reordenarse. Si el test-and-set falla, el currentValue se carga con la semántica acquire memory ordering.

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

Prueba atómica.

Nota: Si utiliza esta función en un bucle, considere utilizar en su lugar la sobrecarga con el argumento adicional T &currentValue, que evita el extra loadRelaxed() en caso de fallo.

Si el valor actual de este QAtomicInteger es el expectedValue, las funciones test-and-set asignan el newValue a este QAtomicInteger y devuelven true. Si los valores no son iguales, esta función no hace nada y devuelve false.

Esta función utiliza una semántica relajada de memory ordering, dejando que el compilador y el procesador reordenen libremente los accesos a memoria.

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

Test-and-set atómico.

Si el valor actual de este QAtomicInteger es el expectedValue, las funciones test-and-set asignan el newValue a este QAtomicInteger y devuelven true. Si los valores no son los mismos, las funciones cargan el valor actual de este QAtomicInteger en currentValue y devuelven false.

Esta función utiliza una semántica relajada de memory ordering, lo que permite al compilador y al procesador reordenar libremente los accesos a la memoria. Si el test-and-set falla, el currentValue se carga con semántica relajada memory ordering.

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

Prueba atómica.

Nota: Si utiliza esta función en un bucle, considere utilizar en su lugar la sobrecarga con el argumento adicional T &currentValue, que evita el extra loadRelaxed() en caso de fallo.

Si el valor actual de este QAtomicInteger es el expectedValue, las funciones test-and-set asignan el newValue a este QAtomicInteger y devuelven true. Si los valores no son iguales, esta función no hace nada y devuelve false.

Esta función utiliza la semántica release memory ordering, que garantiza que el acceso a la memoria antes de la operación atómica (en el orden del programa) no puede reordenarse después de la operación atómica.

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

Test-and-set atómico.

Si el valor actual de este QAtomicInteger es el expectedValue, las funciones test-and-set asignan el newValue a este QAtomicInteger y devuelven true. Si los valores no son los mismos, las funciones cargan el valor actual de este QAtomicInteger en currentValue y devuelven false.

Esta función utiliza la semántica release memory ordering, que garantiza que el acceso a la memoria antes de la operación atómica (en el orden del programa) no puede reordenarse después de la operación atómica. Si el test-and-set falla, el currentValue se carga con semántica relajada memory ordering.

QAtomicInteger::operator T() const

Carga atómicamente el valor de este QAtomicInteger utilizando una ordenación de memoria secuencialmente coherente si es posible; o una ordenación "Adquirir" si no lo es. El valor no se modifica de ninguna manera, pero tenga en cuenta que no hay garantía de que permanezca así.

Véase también loadRelaxed() y loadAcquire().

T QAtomicInteger::operator&=(T value)

Atomic add-and-fetch.

Lee el valor actual de este QAtomicInteger y luego bitwise-ANDs value al valor actual, devolviendo el nuevo valor.

Esta función utiliza un orden de memoria secuencialmente consistente si es posible; o un orden "Ordenado" si no lo es.

Véase también fetchAndAndOrdered().

T QAtomicInteger::operator++()

Preincrementa atómicamente el valor de este QAtomicInteger. Devuelve el nuevo valor de este atómico.

Esta función utiliza un ordenamiento de memoria secuencialmente consistente si es posible; u ordenamiento "Ordenado" si no lo es.

Véase también ref(), operator++(int), y operator--().

T QAtomicInteger::operator++(int)

Postincrementa atómicamente el valor de este QAtomicInteger. Devuelve el valor antiguo de este atómico.

Esta función utiliza un ordenamiento de memoria secuencialmente consistente si es posible; u ordenamiento "Ordenado" si no.

Véase también ref(), operator++(), y operator--(int).

T QAtomicInteger::operator+=(T value)

Atomic add-and-fetch.

Lee el valor actual de este QAtomicInteger y luego añade value al valor actual, devolviendo el nuevo valor.

Esta función utiliza una ordenación de memoria secuencialmente consistente si es posible; u ordenación "Ordenada" si no lo es.

Véase también fetchAndAddOrdered() y operator-=().

T QAtomicInteger::operator--()

Predecrementa atómicamente el valor de este QAtomicInteger. Devuelve el nuevo valor de este atómico.

Esta función utiliza un ordenamiento de memoria secuencialmente consistente si es posible; u ordenamiento "Ordenado" si no lo es.

Véase también deref(), operator--(int), y operator++().

T QAtomicInteger::operator--(int)

Posdecrementa atómicamente el valor de este QAtomicInteger. Devuelve el valor antiguo de este atómico.

Esta función utiliza un ordenamiento de memoria secuencialmente consistente si es posible; u ordenamiento "Ordenado" si no.

Véase también deref(), operator--(), y operator++(int).

T QAtomicInteger::operator-=(T value)

Sub-and-fetch atómico.

Lee el valor actual de este QAtomicInteger y luego resta value al valor actual, devolviendo el nuevo valor.

Esta función utiliza una ordenación de memoria secuencialmente consistente si es posible; u ordenación "Ordenada" si no lo es.

Véase también fetchAndSubOrdered() y operator+=().

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

Almacena atómicamente el otro valor en este tipo atómico utilizando un orden de memoria secuencialmente consistente si es posible; o un orden "Release" si no. Esta función devuelve una referencia a este objeto.

Véase también storeRelaxed() y storeRelease().

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

Asigna other a este QAtomicInteger y devuelve una referencia a este QAtomicInteger.

T QAtomicInteger::operator^=(T value)

xor-and-fetch atómico.

Lee el valor actual de este QAtomicInteger y luego bitwise-XORs value al valor actual, devolviendo el nuevo valor.

Esta función utiliza una ordenación de memoria secuencialmente consistente si es posible; u ordenación "Ordenada" si no lo es.

Véase también fetchAndXorOrdered().

T QAtomicInteger::operator|=(T value)

Or-and-fetch atómico.

Lee el valor actual de este QAtomicInteger y luego bitwise-ORs value al valor actual, devolviendo el nuevo valor.

Esta función utiliza un orden de memoria secuencialmente consistente si es posible; u orden "Ordenado" si no.

Véase también fetchAndOrOrdered().

No miembros relacionados

[noexcept, since 6.7] void qYieldCpu()

Pausa la ejecución del subproceso actual durante un tiempo no especificado, utilizando instrucciones de hardware, sin desprogramar este subproceso. Esta función está pensada para ser utilizada en bucles de alto rendimiento en los que el código espera que otro subproceso modifique una variable atómica. Esto es completamente diferente de QThread::yieldCurrentThread(), que es una operación a nivel de SO que puede sacar todo el hilo de la CPU y permitir que otros hilos (posiblemente pertenecientes a otros procesos) se ejecuten.

Así, en lugar de

while (!condition)
    ;

se debe escribir

while (!condition)
    qYieldCpu();

Esto es útil tanto con multithreading por hardware como sin él en el mismo núcleo. En el caso de los subprocesos por hardware, sirve para evitar que más ejecuciones especulativas llenen el pipeline, lo que podría privar de recursos al subproceso hermano. A través de núcleos y niveles superiores de separación, permite que el protocolo de coherencia de caché asigne la línea de caché que se está modificando e inspeccionando al procesador lógico cuyo resultado espera este código.

También se recomienda hacer un bucle alrededor del código que no modifica la variable global, para evitar la contención en la obtención exclusiva de la ubicación de memoria. Por lo tanto, un bucle de modificación atómica como una adquisición spinlock debe ser:

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

En procesadores x86 y en procesadores RISC-V con la extensión Zihintpause, esto emitirá la instrucción PAUSE, que se ignora en procesadores que no la soportan; en procesadores ARMv7 o ARM posteriores, emitirá la instrucción YIELD.

Esta función se introdujo en Qt 6.7.

Documentación de macros

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE

Esta macro se define si y sólo si su procesador soporta fetch-and-add atómico en enteros.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_NOT_NATIVE

Esta macro se define cuando el hardware no soporta fetch-and-add atómico en enteros.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_SOMETIMES_NATIVE

Esta macro se define cuando sólo ciertas generaciones de procesadores soportan fetch-and-add atómico en enteros. Utilice la función QAtomicInteger::isFetchAndAddNative() para comprobar qué soporta su procesador.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_WAIT_FREE

Esta macro se define junto con Q_ATOMIC_INTnn_FETCH_AND_ADD_IS_ALWAYS_NATIVE para indicar que la obtención y adición atómica de enteros no requiere espera.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE

Esta macro se define si y sólo si su procesador soporta fetch-and-store atómico en enteros.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_NOT_NATIVE

Esta macro se define cuando el hardware no soporta fetch-and-store atómico en enteros.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_SOMETIMES_NATIVE

Esta macro se define cuando sólo ciertas generaciones del procesador soportan fetch-and-store atómico en enteros. Utilice la función QAtomicInteger::isFetchAndStoreNative() para comprobar qué soporta su procesador.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_WAIT_FREE

Esta macro se define junto con Q_ATOMIC_INTnn_FETCH_AND_STORE_IS_ALWAYS_NATIVE para indicar que la obtención y almacenamiento atómico de enteros no requiere espera.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_IS_SUPPORTED

Esta macro se define si se soportan enteros atómicos de tamaño nn (en bits) en esta combinación compilador / arquitectura.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Las siguientes macros siempre definidas:

  • Q_ATOMIC_INT8_IS_SUPPORTED
  • Q_ATOMIC_INT16_IS_SUPPORTED
  • Q_ATOMIC_INT32_IS_SUPPORTED

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE

Esta macro se define si y sólo si todas las generaciones de su procesador soportan el conteo atómico de referencias.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_NOT_NATIVE

Esta macro se define cuando el hardware no soporta el conteo atómico de referencias.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE

Esta macro se define cuando sólo ciertas generaciones del procesador soportan el conteo atómico de referencias. Utilice la función QAtomicInteger::isReferenceCountingNative() para comprobar qué soporta su procesador.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_WAIT_FREE

Esta macro se define junto con Q_ATOMIC_INTnn_REFERENCE_COUNTING_IS_ALWAYS_NATIVE para indicar que el recuento de referencia es sin espera.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE

Esta macro se define si y sólo si su procesador soporta atomic test-and-set en enteros.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_NOT_NATIVE

Esta macro se define cuando el hardware no soporta test-and-set atómico en enteros.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_SOMETIMES_NATIVE

Esta macro se define cuando sólo ciertas generaciones del procesador soportan atomic test-and-set en enteros. Utilice la función QAtomicInteger::isTestAndSetNative() para comprobar qué soporta su procesador.

nn es el tamaño del entero, en bits (8, 16, 32 o 64).

Q_ATOMIC_INTnn_TEST_AND_SET_IS_WAIT_FREE

Esta macro se define junto con Q_ATOMIC_INTnn_TEST_AND_SET_IS_ALWAYS_NATIVE para indicar que el test-and-set atómico sobre enteros está libre de esperas.

nn es el tamaño del entero, en bits (8, 16, 32 o 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.