QRecursiveMutex Class
Die Klasse „QRecursiveMutex“ sorgt für die Serialisierung des Zugriffs zwischen Threads. Mehr dazu...
| Header: | #include <QRecursiveMutex> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QRecursiveMutex ist Teil der Threading-Klassen.
Hinweis: Alle Funktionen dieser Klasse sind threadsicher.
Öffentliche Funktionen
| QRecursiveMutex() | |
| ~QRecursiveMutex() | |
| void | lock() |
(since 6.6) bool | tryLock(QDeadlineTimer timeout = {}) |
| bool | tryLock(int timeout) |
| bool | try_lock() |
| bool | try_lock_for(std::chrono::duration<Rep, Period> duration) |
| bool | try_lock_until(std::chrono::time_point<Clock, Duration> timePoint) |
| void | unlock() |
Ausführliche Beschreibung
Die Klasse `QRecursiveMutex` ist ein Mutex, ähnlich wie ` QMutex`, mit dem sie API-kompatibel ist. Sie unterscheidet sich von ` QMutex ` dadurch, dass sie beliebig oft Aufrufe von ` lock()` aus demselben Thread akzeptiert. ` QMutex ` würde in dieser Situation zu einem Deadlock führen.
Die Erstellung und Nutzung von `QRecursiveMutex` ist wesentlich aufwendiger; verwenden Sie daher nach Möglichkeit immer ein einfaches ` QMutex `. Manchmal ruft jedoch eine öffentliche Funktion eine andere öffentliche Funktion auf, und beide müssen denselben Mutex sperren. In diesem Fall haben Sie zwei Möglichkeiten:
- Legen Sie den Code, der Mutex-Schutz benötigt, in private Funktionen aus, die davon ausgehen, dass der Mutex zum Zeitpunkt ihres Aufrufs gehalten wird, und sperren Sie in den öffentlichen Funktionen einen einfachen „ QMutex “, bevor Sie die privaten Implementierungen aufrufen.
- Oder verwende einen rekursiven Mutex, sodass es keine Rolle spielt, dass die erste öffentliche Funktion den Mutex bereits gesperrt hat, wenn die zweite dies tun möchte.
Siehe auch QMutex, QMutexLocker, QReadWriteLock, QSemaphore und QWaitCondition.
Dokumentation zu den Member-Funktionen
[constexpr noexcept default] QRecursiveMutex::QRecursiveMutex()
Erstellt einen neuen rekursiven Mutex. Der Mutex wird in einem entsperrten Zustand erstellt.
Siehe auch lock() und unlock().
[noexcept] QRecursiveMutex::~QRecursiveMutex()
Löst den Mutex auf.
Warnung: Das Löschen eines gesperrten Mutex kann zu undefiniertem Verhalten führen.
[noexcept(...)] void QRecursiveMutex::lock()
Sperrt den Mutex. Wenn ein anderer Thread den Mutex gesperrt hat, wird dieser Aufruf so lange blockiert, bis dieser Thread ihn wieder freigegeben hat.
Der mehrfache Aufruf dieser Funktion für denselben Mutex aus demselben Thread ist zulässig.
Hinweis: Diese Funktion ist „noexcept“, wenn „ LockIsNoexcept “ den Wert „ true “ hat.
Siehe auch ` unlock()`.
[noexcept(...), since 6.6] bool QRecursiveMutex::tryLock(QDeadlineTimer timeout = {})
Versucht, den Mutex zu sperren. Diese Funktion gibt ` true ` zurück, wenn die Sperre erlangt wurde; andernfalls gibt sie ` false` zurück. Wenn ein anderer Thread den Mutex gesperrt hat, wartet diese Funktion, bis die ` timeout ` abläuft, damit der Mutex verfügbar wird.
Wurde die Sperre erhalten, muss der Mutex mit ` unlock()` entsperrt werden, bevor ein anderer Thread ihn erfolgreich sperren kann.
Der mehrfache Aufruf dieser Funktion für denselben Mutex aus demselben Thread ist zulässig.
Diese Funktion wurde in Qt 6.6 eingeführt.
Hinweis: Diese Funktion ist „noexcept“, wenn „ LockIsNoexcept “ gleich „ true “ ist.
Siehe auch „ lock()“ und „ unlock()“.
[noexcept(...)] bool QRecursiveMutex::tryLock(int timeout)
Versucht, den Mutex zu sperren. Diese Funktion gibt ` true ` zurück, wenn die Sperre erworben wurde; andernfalls gibt sie ` false` zurück. Wenn ein anderer Thread den Mutex gesperrt hat, wartet diese Funktion höchstens timeout Millisekunden, bis der Mutex verfügbar wird.
Hinweis: Die Übergabe einer negativen Zahl als „ timeout “ entspricht dem Aufruf von „ lock()“, d. h., diese Funktion wartet unendlich lange, bis der Mutex gesperrt werden kann, wenn „ timeout “ negativ ist.
Wurde die Sperre erworben, muss der Mutex mit ` unlock()` entsperrt werden, bevor ein anderer Thread ihn erfolgreich sperren kann.
Der mehrfache Aufruf dieser Funktion für denselben Mutex aus demselben Thread ist zulässig.
Hinweis: Diese Funktion ist `noexcept`, wenn ` LockIsNoexcept ` gleich ` true` ist.
Siehe auch ` lock()` und ` unlock()`.
[noexcept(...)] bool QRecursiveMutex::try_lock()
Versucht, den Mutex zu sperren. Diese Funktion gibt ` true ` zurück, wenn die Sperre erworben wurde; andernfalls gibt sie ` false` zurück.
Diese Funktion wird aus Gründen der Kompatibilität mit dem Standardbibliothekskonzept „ Lockable “ bereitgestellt. Sie entspricht „ tryLock()“.
Hinweis: Diese Funktion ist „noexcept“, wenn „ LockIsNoexcept “ gleich „ true “ ist.
template <typename Rep, typename Period> bool QRecursiveMutex::try_lock_for(std::chrono::duration<Rep, Period> duration)
Versucht, den Mutex zu sperren. Diese Funktion gibt ` true ` zurück, wenn die Sperre erworben wurde; andernfalls gibt sie ` false` zurück. Wenn ein anderer Thread den Mutex gesperrt hat, wartet diese Funktion mindestens ` duration `, bis der Mutex verfügbar wird.
Hinweis: Die Übergabe einer negativen Dauer als „ duration “ entspricht dem Aufruf von „ try_lock()“. Dieses Verhalten unterscheidet sich von „ tryLock()“.
Wenn die Sperre erworben wurde, muss der Mutex mit ` unlock()` entsperrt werden, bevor ein anderer Thread ihn erfolgreich sperren kann.
Der mehrfache Aufruf dieser Funktion für denselben Mutex aus demselben Thread ist zulässig.
Siehe auch lock() und unlock().
template <typename Clock, typename Duration> bool QRecursiveMutex::try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)
Versucht, den Mutex zu sperren. Diese Funktion gibt ` true ` zurück, wenn die Sperre erworben wurde; andernfalls gibt sie ` false` zurück. Wenn ein anderer Thread den Mutex gesperrt hat, wartet diese Funktion mindestens so lange, bis ` timePoint `, bis der Mutex verfügbar wird.
Hinweis: Die Übergabe eines bereits abgelaufenen „ timePoint “ entspricht dem Aufruf von „ try_lock()“. Dieses Verhalten unterscheidet sich von „ tryLock()“.
Wurde die Sperre erworben, muss der Mutex mit ` unlock()` entsperrt werden, bevor ein anderer Thread ihn erfolgreich sperren kann.
Der mehrfache Aufruf dieser Funktion für denselben Mutex aus demselben Thread ist zulässig.
Siehe auch lock() und unlock().
[noexcept] void QRecursiveMutex::unlock()
Entsperrt den Mutex. Der Versuch, einen Mutex in einem anderen Thread als demjenigen zu entsperren, der ihn gesperrt hat, führt zu einem Fehler. Das Entsperren eines Mutex, der nicht gesperrt ist, führt zu undefiniertem Verhalten.
Siehe auch ` lock()`.
© 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.