Auf dieser Seite

QMutex Class

Die Klasse „QMutex“ sorgt für die Serialisierung des Zugriffs zwischen Threads. Mehr...

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

Hinweis: Alle Funktionen dieser Klasse sind threadsicher.

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

Ausführliche Beschreibung

Der Zweck eines QMutex besteht darin, ein Objekt, eine Datenstruktur oder einen Codeabschnitt so zu schützen, dass jeweils nur ein Thread darauf zugreifen kann (dies entspricht in etwa dem Java-Schlüsselwort „ synchronized “). In der Regel empfiehlt es sich, einen Mutex zusammen mit einer „ QMutexLocker “ zu verwenden, da sich so leichter sicherstellen lässt, dass das Sperren und Entsperren konsistent erfolgt.

Nehmen wir zum Beispiel an, es gibt eine Methode, die dem Benutzer eine Meldung in zwei Zeilen ausgibt:

int number = 6;

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

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

Werden diese beiden Methoden nacheinander aufgerufen, 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

Werden diese beiden Methoden gleichzeitig von zwei Threads aufgerufen, könnte sich folgende Abfolge 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 zu jedem Zeitpunkt nur ein Thread ` number ` ändern, und das Ergebnis ist korrekt. Dies ist natürlich ein triviales Beispiel, gilt aber für jeden anderen Fall, in dem Abläufe in einer bestimmten Reihenfolge erfolgen müssen.

Wenn Sie ` lock()` in einem Thread aufrufen, werden andere Threads, die versuchen, ` lock()` an derselben Stelle aufzurufen, blockiert, 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 Fall ohne Konkurrenz schnell ist. Es wird kein Speicher zugewiesen, wenn keine Konkurrenz um diesen Mutex besteht. Es wird nahezu ohne Overhead erstellt und freigegeben, was bedeutet, dass es kein Problem darstellt, viele Mutexe als Teil anderer Klassen zu haben.

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

Dokumentation zu Mitgliedsfunktionen

[constexpr noexcept default] QMutex::QMutex()

Erstellt einen neuen Mutex. Der Mutex wird in einem entsperrten Zustand erstellt.

[noexcept] QMutex::~QMutex()

Löst den Mutex auf.

Warnung: Das Löschen eines 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 so lange blockiert, bis dieser Thread die Sperre aufgehoben hat.

Wenn der Mutex bereits vom aktuellen Thread gesperrt war, kehrt dieser Aufruf niemals zurück, was zu einem Deadlock führt.

Hinweis: Diese Funktion ist „noexcept“, wenn „ FutexAlwaysAvailable “ den Wert „ true “ hat.

Siehe auch ` unlock()`.

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

Versucht, den Mutex zu sperren. Diese Funktion gibt „ true “ zurück, wenn die Sperre erfolgreich erworben wurde; andernfalls gibt sie „ false “ zurück. Wenn ein anderer Thread den Mutex gesperrt hat, wartet diese Funktion so lange, bis „ timer “ abgelaufen ist, 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.

Diese Funktion wurde in Qt 6.6 eingeführt.

Hinweis: Diese Funktion ist `noexcept`, wenn ` FutexAlwaysAvailable ` gleich ` true` ist.

Siehe auch ` lock()` und ` unlock()`.

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

Hinweis: Diese Funktion ist „noexcept“, wenn FutexAlwaysAvailable gleich true ist.

Siehe auch ` lock()` und ` unlock()`.

[noexcept] bool QMutex::tryLock()

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

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

Dies ist eine überladene Funktion.

Siehe auch lock() und unlock().

[noexcept] bool QMutex::try_lock()

Versucht, den Mutex zu sperren. Diese Funktion gibt „ true “ zurück, wenn die Sperre erfolgreich erworben wurde; andernfalls gibt sie „ false “ zurück.

Diese Funktion wird aus Gründen der Kompatibilität mit dem Konzept „ Lockable “ der Standardbibliothek bereitgestellt. Sie entspricht „ tryLock()“.

template <typename Rep, typename Period> bool QMutex::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.

Siehe auch „ lock()“ und „ unlock()“.

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

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

Siehe auch ` lock()` und ` unlock()`.

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