QSemaphoreReleaser Class
La classe `QSemaphoreReleaser` permet de différer l'appel à ` QSemaphore::release()` en toute sécurité face aux exceptions. En savoir plus...
| En-tête : | #include <QSemaphoreReleaser> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
- Liste de tous les membres, y compris les membres hérités
- QSemaphoreReleaser fait partie des classes de gestion des threads.
Remarque : 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 normalement la fonction ` QSemaphore::release()`. La création d’un objet `QSemaphoreReleaser` reporte l’appel à `release()` sur le sémaphore jusqu’à la destruction de l’objet `QSemaphoreReleaser` (voir le modèle RAII).
Vous pouvez utiliser cette classe pour libérer un sémaphore de manière fiable et éviter ainsi les blocages (dead-lock) 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 correspondant à ` sem.acquire() ` de poursuivre son exécution.
En utilisant 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 betweencela ne peut plus se produire, car le compilateur s'assurera que le destructeur de `QSemaphoreReleaser` soit toujours appelé, et que le sémaphore soit donc toujours libéré.
QSemaphoreReleaser prend en charge les déplacements et peut donc être renvoyé depuis des fonctions afin de transférer la responsabilité de la libération d’un sémaphore hors d’une fonction ou d’une portée :
{ // some scope
QSemaphoreReleaser releaser; // does nothing
// ...
if (someCondition) {
releaser = QSemaphoreReleaser(sem);
// ...
}
// ...
} // conditionally calls sem.release(), depending on someConditionUn `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 default] QSemaphoreReleaser::QSemaphoreReleaser()
Constructeur par défaut. Crée un objet `QSemaphoreReleaser` qui n'effectue aucune opération.
[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)
Constructeur. Enregistre les arguments et appelle ` sem.release(n)` dans le destructeur.
[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore *sem, int n = 1)
Constructeur. Enregistre les arguments et appelle sem->release(n) dans le destructeur.
[noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphoreReleaser &&other)
Constructeur de déplacement. Prend en charge l'appel de la fonction ` QSemaphore::release()` à partir de ` other`, qui est alors annulée.
Voir également ` cancel()`.
[noexcept] QSemaphoreReleaser::~QSemaphoreReleaser()
À moins d'être annulée, cette fonction appelle ` QSemaphore::release()` avec les arguments fournis au constructeur ou lors de 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 réactiver cette fonctionnalité, attribuez une nouvelle valeur à ` 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 vers l’objet ` QSemaphore ` fourni au constructeur, ou issu de la dernière affectation par déplacement, le cas échéant. Sinon, renvoie ` nullptr`.
[noexcept] void QSemaphoreReleaser::swap(QSemaphoreReleaser &other)
Permute les responsabilités de *this et other.
Contrairement à l'affectation par 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 ne peut jamais échouer.
[noexcept] QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)
Déplacement de l'opérateur d'affectation. Prend en charge l'appel de ` QSemaphore::release()` à partir de ` other`, qui est alors annulé.
Si ce libérateur de sémaphore avait pour responsabilité d'appeler lui-même une fonction ` QSemaphore::release()`, il effectue cet appel avant de prendre le relais de ` other`.
Voir également 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.