En esta página

QSemaphoreReleaser Class

La clase QSemaphoreReleaser proporciona un aplazamiento a prueba de excepciones de una llamada a QSemaphore::release(). Más...

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

Nota: Todas las funciones de esta clase son reentrantes.

Funciones Públicas

QSemaphoreReleaser()
QSemaphoreReleaser(QSemaphore &sem, int n = 1)
QSemaphoreReleaser(QSemaphore *sem, int n = 1)
QSemaphoreReleaser(QSemaphoreReleaser &&other)
~QSemaphoreReleaser()
QSemaphore *cancel()
QSemaphore *semaphore() const
void swap(QSemaphoreReleaser &other)
QSemaphoreReleaser &operator=(QSemaphoreReleaser &&other)

Descripción Detallada

QSemaphoreReleaser puede usarse donde se usaría QSemaphore::release(). Construir un QSemaphoreReleaser aplaza la llamada a release() en el semáforo hasta que el QSemaphoreReleaser sea destruido (ver patrón RAII).

Puedes usar esto para liberar un semáforo de forma fiable y evitar el bloqueo ante excepciones o retornos anticipados:

// ... do something that may throw or return early
sem.release();

Si se produce un retorno anticipado o se lanza una excepción antes de alcanzar la llamada a sem.release(), el semáforo no se libera, impidiendo posiblemente que el hilo que espera en la correspondiente llamada a sem.acquire() continúe alguna vez la ejecución.

Cuando se utiliza RAII en su lugar:

const QSemaphoreReleaser releaser(sem);
// ... do something that may throw or early return
// implicitly calls sem.release() here and at every other return in between

esto ya no puede suceder, porque el compilador se asegurará de que el destructor QSemaphoreReleaser siempre es llamado, y por lo tanto el semáforo siempre es liberado.

QSemaphoreReleaser es move-enabled y por tanto puede ser devuelto desde funciones para transferir la responsabilidad de liberar un semáforo fuera de una función o ámbito:

{ // some scope
    QSemaphoreReleaser releaser; // does nothing
    // ...
    if (someCondition) {
        releaser = QSemaphoreReleaser(sem);
        // ...
    }
    // ...
} // conditionally calls sem.release(), depending on someCondition

Un QSemaphoreReleaser puede ser cancelado por una llamada a cancel(). Un liberador de semáforo cancelado ya no llamará a QSemaphore::release() en su destructor.

Véase también QMutexLocker.

Documentación de funciones miembro

[constexpr noexcept] QSemaphoreReleaser::QSemaphoreReleaser()

Constructor por defecto. Crea un QSemaphoreReleaser que no hace nada.

[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)

Constructor. Almacena los argumentos y llama a sem.release(n) en el destructor.

[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore *sem, int n = 1)

Constructor. Almacena los argumentos y llama a sem->release(n) en el destructor.

[noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphoreReleaser &&other)

Mover constructor. Asume la responsabilidad de llamar a QSemaphore::release() desde other, que a su vez se cancela.

Véase también cancel().

[noexcept] QSemaphoreReleaser::~QSemaphoreReleaser()

A menos que se cancele, llama a QSemaphore::release() con los argumentos proporcionados al constructor, o por la última asignación de movimiento.

[noexcept] QSemaphore *QSemaphoreReleaser::cancel()

Cancela este QSemaphoreReleaser de forma que el destructor ya no llamará a semaphore()->release(). Devuelve el valor de semaphore() antes de esta llamada. Después de esta llamada, semaphore() devolverá nullptr.

Para habilitarlo de nuevo, asigna un nuevo QSemaphoreReleaser:

releaser.cancel(); // avoid releasing old semaphore()
releaser = QSemaphoreReleaser(sem, 42);
// now will call sem.release(42) when 'releaser' is destroyed

[noexcept] QSemaphore *QSemaphoreReleaser::semaphore() const

Devuelve un puntero al objeto QSemaphore proporcionado al constructor, o por la última asignación de movimiento, si existe. En caso contrario, devuelve nullptr.

[noexcept] void QSemaphoreReleaser::swap(QSemaphoreReleaser &other)

Intercambia las responsabilidades de *this y other.

A diferencia de la asignación de movimientos, ninguno de los dos objetos libera nunca su semáforo, si lo hay, como consecuencia del intercambio.

Por lo tanto, esta función es muy rápida y nunca falla.

[noexcept] QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)

Operador de asignación de movimiento. Asume la responsabilidad de llamar a QSemaphore::release() desde other, que a su vez se cancela.

Si este liberador de semáforo tenía la responsabilidad de llamar a algún QSemaphore::release() por sí mismo, realiza la llamada antes de tomar el relevo de other.

Véase también cancel().

© 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.