QSemaphoreReleaser Class
Die Klasse QSemaphoreReleaser ermöglicht die ausnahmesichere Verschiebung eines QSemaphore::release()-Aufrufs. Mehr...
Kopfzeile: | #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 in 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) |
Detaillierte Beschreibung
QSemaphoreReleaser kann überall dort verwendet werden, wo man sonst QSemaphore::release() verwenden würde. Die Konstruktion eines QSemaphoreReleasers verschiebt den release()-Aufruf des Semaphors, bis der QSemaphoreReleaser zerstört wird (siehe RAII-Muster).
Sie können dies verwenden, um eine Semaphore zuverlässig freizugeben, um Deadlocks angesichts von Exceptions oder frühen Rückgaben zu vermeiden:
// ... do something that may throw or return early sem.release();
Wenn ein vorzeitiger Rücksprung erfolgt oder eine Exception ausgelöst wird, bevor der sem.release()
-Aufruf erreicht ist, wird die Semaphore nicht freigegeben, was möglicherweise verhindert, dass der Thread, der im entsprechenden sem.acquire()
-Aufruf wartet, jemals die Ausführung fortsetzt.
Wenn Sie stattdessen RAII verwenden:
const QSemaphoreReleaser releaser(sem); // ... do something that may throw or early return // implicitly calls sem.release() here and at every other return in between
kann dies nicht mehr passieren, da der Compiler sicherstellt, dass der QSemaphoreReleaser Destruktor immer aufgerufen wird und somit die Semaphore immer freigegeben wird.
QSemaphoreReleaser ist move-enabled und kann daher von Funktionen zurückgegeben werden, um die Verantwortung für die Freigabe einer Semaphore aus einer Funktion oder einem Bereich heraus zu übertragen:
{ // some scope QSemaphoreReleaser releaser; // does nothing // ... if (someCondition) { releaser = QSemaphoreReleaser(sem); // ... } // ... } // conditionally calls sem.release(), depending on someCondition
Ein QSemaphoreReleaser kann durch einen Aufruf von cancel() abgebrochen werden. Ein abgebrochener SemaphoreReleaser wird nicht mehr QSemaphore::release() in seinem Destruktor aufrufen.
Siehe auch QMutexLocker.
Dokumentation der Mitgliedsfunktionen
[constexpr noexcept]
QSemaphoreReleaser::QSemaphoreReleaser()
Standard-Konstruktor. Erzeugt einen QSemaphoreReleaser, der nichts tut.
[explicit noexcept]
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)
Konstruktor. Speichert die Argumente und ruft sem.release(n) im Destruktor 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)
Konstruktor verschieben. Übernimmt die Verantwortung für den Aufruf von QSemaphore::release() von other, der seinerseits abgebrochen wird.
Siehe auch cancel().
[noexcept]
QSemaphoreReleaser::~QSemaphoreReleaser()
Sofern nicht abgebrochen, ruft QSemaphore::release() mit den Argumenten auf, die dem Konstruktor übergeben wurden, oder durch die letzte Zugzuweisung.
[noexcept]
QSemaphore *QSemaphoreReleaser::cancel()
Bricht diese QSemaphoreReleaser ab, so dass der Destruktor nicht mehr semaphore()->release()
aufruft. Gibt den Wert von semaphore() vor diesem Aufruf zurück. Nach diesem Aufruf wird semaphore() nullptr
zurückgeben.
Um 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 QSemaphore Objekt zurück, das dem Konstruktor zur Verfügung gestellt wurde, oder durch die letzte Move-Zuweisung, falls vorhanden. Andernfalls wird nullptr
zurückgegeben.
[noexcept]
void QSemaphoreReleaser::swap(QSemaphoreReleaser &other)
Tauscht die Zuständigkeiten von *this
und other aus.
Anders als bei der Zuweisung von Verschiebungen gibt keines der beiden Objekte als Folge des Tauschvorgangs jemals seine Semaphore frei, sofern vorhanden.
Daher ist diese Funktion sehr schnell und schlägt nie fehl.
[noexcept]
QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)
Zuweisungsoperator verschieben. Übernimmt die Verantwortung für den Aufruf von QSemaphore::release() von other, das seinerseits abgebrochen wird.
Wenn dieser Semaphor-Freigabeoperator selbst die Verantwortung hatte, QSemaphore::release() aufzurufen, führt er den Aufruf durch, bevor er die Verantwortung von other übernimmt.
Siehe auch cancel().
© 2025 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.