QRecursiveMutex Class

Die Klasse QRecursiveMutex bietet Zugriffsserialisierung zwischen Threads. Mehr...

Kopfzeile: #include <QRecursiveMutex>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

Hinweis: Alle Funktionen in dieser Klasse sind thread-sicher.

Ö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()

Detaillierte Beschreibung

Die Klasse QRecursiveMutex ist ein Mutex, wie QMutex, mit dem sie API-kompatibel ist. Sie unterscheidet sich von QMutex dadurch, dass sie lock()-Aufrufe von demselben Thread beliebig oft akzeptiert. QMutex würde in dieser Situation in eine Sackgasse geraten.

QRecursiveMutex ist viel teurer zu konstruieren und zu bedienen, also verwenden Sie ein einfaches QMutex wann immer Sie können. 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:

  • Fassen Sie den Code, der einen Mutex-Schutz benötigt, in privaten Funktionen zusammen, die davon ausgehen, dass der Mutex beim Aufruf gehalten wird, und sperren Sie ein einfaches QMutex in den öffentlichen Funktionen, bevor Sie die private Implementierung aufrufen.
  • Oder verwenden Sie einen rekursiven Mutex, so dass 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 der Mitgliedsfunktionen

[constexpr noexcept] QRecursiveMutex::QRecursiveMutex()

Konstruiert eine neue rekursive Mutex. Der Mutex wird in einem ungesperrten Zustand erzeugt.

Siehe auch lock() und unlock().

[noexcept] QRecursiveMutex::~QRecursiveMutex()

Zerstört die Mutex.

Warnung: Das Zerstören einer gesperrten Mutex kann zu undefiniertem Verhalten führen.

[noexcept] void QRecursiveMutex::lock()

Sperrt den Mutex. Wenn ein anderer Thread den Mutex gesperrt hat, blockiert dieser Aufruf, bis dieser Thread ihn wieder entsperrt hat.

Der mehrfache Aufruf dieser Funktion auf denselben Mutex vom selben Thread ist erlaubt.

Siehe auch unlock().

[noexcept, since 6.6] bool QRecursiveMutex::tryLock(QDeadlineTimer timeout = {})

Versucht, die Mutex zu sperren. Diese Funktion gibt true zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false zurück. Wenn ein anderer Thread den Mutex gesperrt hat, wartet diese Funktion, bis timeout abläuft, um den Mutex verfügbar zu machen.

Wenn die Sperre erhalten wurde, muss der Mutex mit unlock() entsperrt werden, bevor ein anderer Thread ihn erfolgreich sperren kann.

Ein mehrfacher Aufruf dieser Funktion auf denselben Mutex vom selben Thread aus ist erlaubt.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch lock() und unlock().

[noexcept] bool QRecursiveMutex::tryLock(int timeout)

Versucht, die Mutex zu sperren. Diese Funktion gibt true zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false zurück. Wenn ein anderer Thread die Mutex gesperrt hat, wartet diese Funktion höchstens timeout Millisekunden, bis die Mutex wieder verfügbar ist.

Hinweis: Die Übergabe einer negativen Zahl als timeout ist gleichbedeutend mit dem Aufruf von lock(), d.h. diese Funktion wird ewig warten, bis der Mutex gesperrt werden kann, wenn timeout negativ ist.

Wenn die Sperre erhalten wurde, muss der Mutex mit unlock() entsperrt werden, bevor ein anderer Thread ihn erfolgreich sperren kann.

Ein mehrfacher Aufruf dieser Funktion auf denselben Mutex vom selben Thread aus ist erlaubt.

Siehe auch lock() und unlock().

[noexcept] bool QRecursiveMutex::try_lock()

Versucht, die Mutex zu sperren. Diese Funktion gibt true zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false zurück.

Diese Funktion wird aus Gründen der Kompatibilität mit dem Konzept der Standardbibliothek Lockable bereitgestellt. Sie ist äquivalent zu tryLock().

template <typename Rep, typename Period> bool QRecursiveMutex::try_lock_for(std::chrono::duration<Rep, Period> duration)

Versucht, die Mutex zu sperren. Diese Funktion gibt true zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false zurück. Wenn ein anderer Thread die Mutex gesperrt hat, wartet diese Funktion mindestens duration, bis die Mutex wieder verfügbar ist.

Hinweis: Die Übergabe einer negativen Dauer als duration ist gleichbedeutend mit dem Aufruf von try_lock(). Dieses Verhalten unterscheidet sich von tryLock().

Wenn die Sperre erhalten wurde, muss der Mutex mit unlock() entsperrt werden, bevor ein anderer Thread ihn erfolgreich sperren kann.

Der mehrfache Aufruf dieser Funktion auf denselben Mutex vom selben Thread aus ist erlaubt.

Siehe auch lock() und unlock().

template <typename Clock, typename Duration> bool QRecursiveMutex::try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)

Versucht, die Mutex zu sperren. Diese Funktion gibt true zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false zurück. Wenn ein anderer Thread die Mutex gesperrt hat, wartet diese Funktion mindestens bis timePoint, bis die Mutex verfügbar wird.

Hinweis: Die Übergabe eines timePoint, das bereits übergeben wurde, entspricht dem Aufruf von try_lock(). Dieses Verhalten unterscheidet sich von tryLock().

Wenn die Sperre erhalten wurde, muss der Mutex mit unlock() entsperrt werden, bevor ein anderer Thread ihn erfolgreich sperren kann.

Der mehrfache Aufruf dieser Funktion auf denselben Mutex vom selben Thread aus ist erlaubt.

Siehe auch lock() und unlock().

[noexcept] void QRecursiveMutex::unlock()

Entriegelt den Mutex. Der Versuch, einen Mutex in einem anderen Thread als dem, der ihn gesperrt hat, zu entsperren, führt zu einem Fehler. Das Entsperren eines Mutex, der nicht gesperrt ist, führt zu undefiniertem Verhalten.

Siehe auch 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.