QSemaphoreReleaser Class
Die Klasse „QSemaphoreReleaser“ ermöglicht die ausnahmensichere Verschiebung eines Aufrufs von „ QSemaphore::release()“. Mehr...
| Header: | #include <QSemaphoreReleaser> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QSemaphoreReleaser ist Teil der Threading-Klassen.
Hinweis: Alle Funktionen dieser Klasse sind reentrant.
Öffentliche Funktionen
| 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) |
Ausführliche Beschreibung
QSemaphoreReleaser kann überall dort verwendet werden, wo Sie andernfalls QSemaphore::release() verwenden würden. Durch die Erstellung eines QSemaphoreReleasers wird der Aufruf von release() für das Semaphor aufgeschoben, bis der QSemaphoreReleaser zerstört wird (siehe RAII-Muster).
Sie können dies nutzen, um ein Semaphor zuverlässig freizugeben und so Deadlocks bei Ausnahmen oder vorzeitigen Rücksprüngen zu vermeiden:
// ... do something that may throw or return early
sem.release();Wenn vor Erreichen des Aufrufs von ` sem.release() ` ein vorzeitiger Rücktritt erfolgt oder eine Ausnahme ausgelöst wird, wird das Semaphor nicht freigegeben, was möglicherweise dazu führt, dass der Thread, der im entsprechenden ` sem.acquire() `-Aufruf wartet, die Ausführung nie fortsetzen kann.
Bei Verwendung von RAII hingegen:
const QSemaphoreReleaser releaser(sem);
// ... do something that may throw or early return
// implicitly calls sem.release() here and at every other return in betweenkann dies nicht mehr passieren, da der Compiler sicherstellt, dass der Destruktor von `QSemaphoreReleaser` immer aufgerufen wird und somit das Semaphor stets freigegeben wird.
`QSemaphoreReleaser` ist „move-enabled“ und kann daher aus Funktionen zurückgegeben werden, um die Verantwortung für die Freigabe eines Semaphors aus einer Funktion oder einem Gültigkeitsbereich heraus zu verlagern:
{ // some scope
QSemaphoreReleaser releaser; // does nothing
// ...
if (someCondition) {
releaser = QSemaphoreReleaser(sem);
// ...
}
// ...
} // conditionally calls sem.release(), depending on someConditionEin `QSemaphoreReleaser` kann durch einen Aufruf von ` cancel()` abgebrochen werden. Ein abgebrochener Semaphor-Freigaber ruft in seinem Destruktor nicht mehr ` QSemaphore::release()` auf.
Siehe auch ` QMutexLocker`.
Dokumentation zu den Mitgliedsfunktionen
[constexpr noexcept default] QSemaphoreReleaser::QSemaphoreReleaser()
Standardkonstruktor. Erstellt einen QSemaphoreReleaser, der keine Aktion ausführt.
[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)
Konstruktor. Speichert die Argumente und ruft im Destruktor ` sem.release(n)` auf.
[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore *sem, int n = 1)
Konstruktor. Speichert die Argumente und ruft im Destruktor „ sem->release(n)“ auf.
[noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphoreReleaser &&other)
Move-Konstruktor. Übernimmt die Verantwortung für den Aufruf von ` QSemaphore::release()` aus ` other`, wodurch dieser wiederum abgebrochen wird.
Siehe auch ` cancel()`.
[noexcept] QSemaphoreReleaser::~QSemaphoreReleaser()
Sofern nicht abgebrochen, wird die Funktion „ QSemaphore::release()“ mit den an den Konstruktor übergebenen Argumenten oder mit den Argumenten der letzten Move-Zuweisung aufgerufen.
[noexcept] QSemaphore *QSemaphoreReleaser::cancel()
Hebt diesen ` QSemaphoreReleaser ` auf, sodass der Destruktor ` semaphore()->release()` nicht mehr aufruft. Gibt den Wert von ` semaphore()` vor diesem Aufruf zurück. Nach diesem Aufruf gibt ` semaphore()` den Wert ` nullptr` zurück.
Um die Funktion wieder zu aktivieren, weisen Sie eine neue ` QSemaphoreReleaser` zu:
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
Gibt einen Zeiger auf das Objekt „ QSemaphore “ zurück, das dem Konstruktor übergeben wurde, oder – falls vorhanden – auf das Objekt aus der letzten Move-Zuweisung. Andernfalls wird „ nullptr “ zurückgegeben.
[noexcept] void QSemaphoreReleaser::swap(QSemaphoreReleaser &other)
Tauscht die Zuständigkeiten von *this und other aus.
Im Gegensatz zur Zuweisungsverschiebung gibt keines der beiden Objekte infolge des Austauschs sein Semaphor (sofern vorhanden) jemals frei.
Daher ist diese Funktion sehr schnell und schlägt niemals fehl.
[noexcept] QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)
Move-Zuweisungsoperator. Übernimmt die Verantwortung für den Aufruf von ` QSemaphore::release()` von ` other`, wodurch dieser wiederum abgebrochen wird.
Wenn dieser Semaphor-Freigaber selbst die Aufgabe hatte, QSemaphore::release() aufzurufen, führt er den Aufruf aus, bevor er die Verantwortung von other übernimmt.
Siehe auch ` 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.