QMutexLocker Class
template <typename Mutex> class QMutexLockerDie Klasse QMutexLocker ist eine Komfortklasse, die das Sperren und Entsperren von Mutexen vereinfacht. Mehr...
Kopfzeile: | #include <QMutexLocker> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QMutexLocker ist Teil der Threading-Klassen.
Hinweis: Alle Funktionen in dieser Klasse sind thread-sicher.
Öffentliche Funktionen
QMutexLocker(Mutex *mutex) | |
(since 6.4) | QMutexLocker(QMutexLocker<Mutex> &&other) |
~QMutexLocker() | |
(since 6.4) bool | isLocked() const |
Mutex * | mutex() const |
void | relock() |
(since 6.4) void | swap(QMutexLocker<Mutex> &other) |
void | unlock() |
(since 6.4) QMutexLocker<Mutex> & | operator=(QMutexLocker<Mutex> &&other) |
Detaillierte Beschreibung
Das Sperren und Entsperren von QMutex oder QRecursiveMutex in komplexen Funktionen und Anweisungen oder in Code zur Ausnahmebehandlung ist fehleranfällig und schwer zu debuggen. QMutexLocker kann in solchen Situationen verwendet werden, um sicherzustellen, dass der Zustand des Mutex immer wohldefiniert ist.
QMutexLocker sollte innerhalb einer Funktion erstellt werden, in der eine QMutex gesperrt werden muss. Die Mutex wird bei der Erstellung von QMutexLocker gesperrt. Sie können den Mutex mit unlock()
und relock()
entsperren und wieder sperren. Ist der Mutex gesperrt, wird er entsperrt, wenn QMutexLocker zerstört wird.
Diese komplexe Funktion sperrt z. B. einen QMutex beim Eintritt in die Funktion und hebt die Sperre des Mutex an allen Ausgangspunkten auf:
int complexFunction(int flag) { mutex.lock(); int retVal = 0; switch (flag) { case 0: case 1: retVal = moreComplexFunction(flag); break; case 2: { int status = anotherFunction(); if (status < 0) { mutex.unlock(); return -2; } retVal = status + flag; } break; default: if (flag > 10) { mutex.unlock(); return -1; } break; } mutex.unlock(); return retVal; }
Diese Beispielfunktion wird im Laufe ihrer Entwicklung immer komplizierter werden, was die Wahrscheinlichkeit von Fehlern erhöht.
Die Verwendung von QMutexLocker vereinfacht den Code erheblich und macht ihn besser lesbar:
int complexFunction(int flag) { QMutexLocker locker(&mutex); int retVal = 0; switch (flag) { case 0: case 1: return moreComplexFunction(flag); case 2: { int status = anotherFunction(); if (status < 0) return -2; retVal = status + flag; } break; default: if (flag > 10) return -1; break; } return retVal; }
Jetzt wird der Mutex immer entsperrt, wenn das QMutexLocker-Objekt zerstört wird (wenn die Funktion zurückkehrt, da locker
eine automatische Variable ist).
Das gleiche Prinzip gilt für Code, der Ausnahmen auslöst und abfängt. Eine Ausnahme, die nicht in der Funktion abgefangen wird, die den Mutex gesperrt hat, kann den Mutex nicht entsperren, bevor die Ausnahme auf dem Stack an die aufrufende Funktion weitergegeben wird.
QMutexLocker bietet auch eine Funktion mutex()
, die den Mutex zurückgibt, mit dem QMutexLocker arbeitet. Dies ist nützlich für Code, der Zugriff auf den Mutex benötigt, wie z. B. QWaitCondition::wait(). Zum Beispiel:
class SignalWaiter { private: QMutexLocker<QMutex> locker; public: SignalWaiter(QMutex *mutex) : locker(mutex) { } void waitForSignal() { ... while (!signalled) waitCondition.wait(locker.mutex()); ... } };
Siehe auch QReadLocker, QWriteLocker, und QMutex.
Dokumentation der Mitgliedsfunktionen
[explicit noexcept]
QMutexLocker::QMutexLocker(Mutex *mutex)
Konstruiert einen QMutexLocker und sperrt mutex. Der Mutex wird entsperrt, wenn QMutexLocker zerstört wird. Wenn mutex nullptr
ist, führt QMutexLocker nichts aus.
Siehe auch QMutex::lock().
[noexcept, since 6.4]
QMutexLocker::QMutexLocker(QMutexLocker<Mutex> &&other)
Move-konstruiert einen QMutexLocker aus other. Der Mutex und der Zustand von other werden an die neu konstruierte Instanz übertragen. Nach dem Verschieben verwaltet other keinen Mutex mehr.
Diese Funktion wurde in Qt 6.4 eingeführt.
Siehe auch QMutex::lock().
QMutexLocker::~QMutexLocker()
Zerstört die QMutexLocker und gibt die im Konstruktor gesperrte Mutex wieder frei.
Siehe auch QMutex::unlock().
[noexcept, since 6.4]
bool QMutexLocker::isLocked() const
Gibt true zurück, wenn diese QMutexLocker gerade ihre zugehörige Mutex sperrt, oder false andernfalls.
Diese Funktion wurde in Qt 6.4 eingeführt.
Mutex *QMutexLocker::mutex() const
Gibt die Mutex zurück, mit der QMutexLocker arbeitet.
[noexcept]
void QMutexLocker::relock()
Sperrt einen nicht gesperrten Mutex-Schrank wieder.
Siehe auch unlock().
[noexcept, since 6.4]
void QMutexLocker::swap(QMutexLocker<Mutex> &other)
Tauscht den Mutex und den Zustand dieses QMutexLocker mit other. Dieser Vorgang ist sehr schnell und schlägt nie fehl.
Diese Funktion wurde in Qt 6.4 eingeführt.
Siehe auch QMutex::lock().
[noexcept]
void QMutexLocker::unlock()
Entsperrt diesen Mutex-Schrank. Sie können relock()
verwenden, um es wieder zu sperren. Er muss nicht gesperrt werden, wenn er zerstört wird.
Siehe auch relock().
[noexcept, since 6.4]
QMutexLocker<Mutex> &QMutexLocker::operator=(QMutexLocker<Mutex> &&other)
Verschieben - weist other dieser QMutexLocker zu. Wenn QMutexLocker vor der Zuweisung einen gesperrten Mutex hielt, wird der Mutex wieder entsperrt. Der Mutex und der Zustand von other werden dann an dieses QMutexLocker übertragen. Nach der Verschiebung wird other keinen Mutex mehr verwalten.
Diese Funktion wurde in Qt 6.4 eingeführt.
Siehe auch QMutex::lock().
© 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.