QMutex Class

Die Klasse QMutex ermöglicht die Zugriffsserialisierung zwischen Threads. Mehr...

Kopfzeile: #include <QMutex>
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

QMutex()
~QMutex()
void lock()
(since 6.6) bool tryLock(QDeadlineTimer timer)
bool tryLock(int timeout)
bool tryLock()
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

Der Zweck eines QMutex ist es, ein Objekt, eine Datenstruktur oder einen Codeabschnitt zu schützen, so dass jeweils nur ein Thread darauf zugreifen kann (ähnlich wie beim Java-Schlüsselwort synchronized ). In der Regel ist es am besten, einen Mutex mit QMutexLocker zu verwenden, da so leicht sichergestellt werden kann, dass das Sperren und Entsperren konsistent durchgeführt wird.

Nehmen wir an, es gibt eine Methode, die eine Nachricht an den Benutzer in zwei Zeilen ausgibt:

int number = 6;

void method1()
{
    number *= 5;
    number /= 4;
}

void method2()
{
    number *= 3;
    number /= 2;
}

Wenn diese beiden Methoden nacheinander aufgerufen werden, geschieht Folgendes:

// method1()
number *= 5;        // number is now 30
number /= 4;        // number is now 7

// method2()
number *= 3;        // number is now 21
number /= 2;        // number is now 10

Wenn diese beiden Methoden gleichzeitig von zwei Threads aus aufgerufen werden, könnte sich die folgende Sequenz ergeben:

// Thread 1 calls method1()
number *= 5;        // number is now 30

// Thread 2 calls method2().
//
// Most likely Thread 1 has been put to sleep by the operating
// system to allow Thread 2 to run.
number *= 3;        // number is now 90
number /= 2;        // number is now 45

// Thread 1 finishes executing.
number /= 4;        // number is now 11, instead of 10

Wenn wir einen Mutex hinzufügen, sollten wir das gewünschte Ergebnis erhalten:

QMutex mutex;
int number = 6;

void method1()
{
    mutex.lock();
    number *= 5;
    number /= 4;
    mutex.unlock();
}

void method2()
{
    mutex.lock();
    number *= 3;
    number /= 2;
    mutex.unlock();
}

Dann kann immer nur ein Thread number ändern und das Ergebnis ist korrekt. Dies ist natürlich ein triviales Beispiel, gilt aber auch für jeden anderen Fall, in dem Dinge in einer bestimmten Reihenfolge geschehen müssen.

Wenn Sie lock() in einem Thread aufrufen, blockieren andere Threads, die versuchen, lock() an der gleichen Stelle aufzurufen, bis der Thread, der die Sperre erhalten hat, unlock() aufruft. Eine nicht-blockierende Alternative zu lock() ist tryLock().

QMutex ist so optimiert, dass es im nicht-beabsichtigten Fall schnell ist. Es wird kein Speicher allokiert, wenn es keine Konkurrenz um diese Mutex gibt. Er wird fast ohne Overhead erstellt und zerstört, was bedeutet, dass es in Ordnung ist, viele Mutexe als Teil anderer Klassen zu haben.

Siehe auch QRecursiveMutex, QMutexLocker, QReadWriteLock, QSemaphore, und QWaitCondition.

Dokumentation der Mitgliedsfunktionen

[constexpr noexcept] QMutex::QMutex()

Konstruiert eine neue Mutex. Der Mutex wird in einem nicht gesperrten Zustand erstellt.

[noexcept] QMutex::~QMutex()

Zerstört die Mutex.

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

[noexcept] void QMutex::lock()

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

Ein mehrfacher Aufruf dieser Funktion auf denselben Mutex vom selben Thread aus führt zu einem Deadlock.

Siehe auch unlock().

[noexcept, since 6.6] bool QMutex::tryLock(QDeadlineTimer timer)

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 timer 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 führt zu einem Dead-Lock.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch lock() und unlock().

[noexcept] bool QMutex::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 für denselben Mutex vom selben Thread aus führt zu einem Dead-Lock.

Siehe auch lock() und unlock().

[noexcept] bool QMutex::tryLock()

Dies ist eine überladene Funktion.

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

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 für denselben Mutex vom selben Thread aus führt zu einem Dead-Lock.

Siehe auch lock() und unlock().

[noexcept] bool QMutex::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 QMutex::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.

Ein mehrfacher Aufruf dieser Funktion für dieselbe Mutex vom selben Thread aus führt zu einem Deadlock.

Siehe auch lock() und unlock().

template <typename Clock, typename Duration> bool QMutex::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.

Ein mehrfacher Aufruf dieser Funktion auf denselben Mutex vom selben Thread aus führt zu einem Deadlock.

Siehe auch lock() und unlock().

[noexcept] void QMutex::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.