Sur cette page

QSemaphoreReleaser Class

La classe QSemaphoreReleaser permet de reporter un appel à QSemaphore::release() sans risque d'exception. Plus...

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

Note : Toutes les fonctions de cette classe sont réentrantes.

Fonctions publiques

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)

Description détaillée

QSemaphoreReleaser peut être utilisé partout où vous utiliseriez QSemaphore::release(). La construction d'un QSemaphoreReleaser reporte l'appel à release() sur le sémaphore jusqu'à ce que le QSemaphoreReleaser soit détruit (voir le modèle RAII).

Vous pouvez utiliser cette fonction pour libérer un sémaphore de manière fiable et éviter les blocages en cas d'exceptions ou de retours anticipés :

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

Si un retour anticipé est effectué ou si une exception est levée avant que l'appel sem.release() ne soit atteint, le sémaphore n'est pas libéré, ce qui peut empêcher le thread en attente dans l'appel sem.acquire() correspondant de poursuivre son exécution.

Lorsque l'on utilise RAII à la place :

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

cela ne peut plus se produire, car le compilateur s'assurera que le destructeur de QSemaphoreReleaser est toujours appelé, et donc que le sémaphore est toujours libéré.

QSemaphoreReleaser peut être déplacé et peut donc être renvoyé par des fonctions pour transférer la responsabilité de la libération d'un sémaphore hors d'une fonction ou d'un champ d'application :

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

Un QSemaphoreReleaser peut être annulé par un appel à cancel(). Un libérateur de sémaphore annulé n'appellera plus QSemaphore::release() dans son destructeur.

Voir également QMutexLocker.

Documentation des fonctions membres

[constexpr noexcept] QSemaphoreReleaser::QSemaphoreReleaser()

Constructeur par défaut. Crée un QSemaphoreReleaser qui ne fait rien.

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

Constructeur. Stocke les arguments et appelle sem.release(n) dans le destructeur.

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

Constructeur. Stocke les arguments et appelle sem->release(n) dans le destructeur.

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

Déplacer le constructeur. Reprend la responsabilité d'appeler QSemaphore::release() à partir de other, qui est à son tour annulé.

Voir aussi cancel().

[noexcept] QSemaphoreReleaser::~QSemaphoreReleaser()

Sauf annulation, appelle QSemaphore::release() avec les arguments fournis au constructeur, ou par la dernière affectation de déplacement.

[noexcept] QSemaphore *QSemaphoreReleaser::cancel()

Annule cette QSemaphoreReleaser de sorte que le destructeur n'appelle plus semaphore()->release(). Renvoie la valeur de semaphore() avant cet appel. Après cet appel, semaphore() renverra nullptr.

Pour l'activer à nouveau, attribuez un nouveau 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

Renvoie un pointeur sur l'objet QSemaphore fourni au constructeur, ou par la dernière affectation de déplacement, le cas échéant. Sinon, il renvoie nullptr.

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

Échange les responsabilités de *this et other.

Contrairement à l'affectation de déplacement, aucun des deux objets ne libère jamais son sémaphore, le cas échéant, à la suite de l'échange.

Cette fonction est donc très rapide et n'échoue jamais.

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

Opérateur d'assignation de mouvement. Prend la responsabilité d'appeler QSemaphore::release() à partir de other, qui à son tour est annulé.

Si ce libérateur de sémaphore avait la responsabilité d'appeler lui-même un certain QSemaphore::release(), il effectue l'appel avant de prendre le relais de other.

Voir aussi 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.