QReadWriteLock Class
Die Klasse QReadWriteLock ermöglicht Lese- und Schreibsperren. Mehr...
Kopfzeile: | #include <QReadWriteLock> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QReadWriteLock ist Teil der Threading-Klassen.
Hinweis: Alle Funktionen in dieser Klasse sind thread-sicher.
Öffentliche Typen
enum | RecursionMode { Recursive, NonRecursive } |
Öffentliche Funktionen
QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive) | |
~QReadWriteLock() | |
void | lockForRead() |
void | lockForWrite() |
bool | tryLockForRead(int timeout) |
(since 6.6) bool | tryLockForRead(QDeadlineTimer timeout = {}) |
bool | tryLockForWrite(int timeout) |
(since 6.6) bool | tryLockForWrite(QDeadlineTimer timeout = {}) |
void | unlock() |
Detaillierte Beschreibung
Eine Lese-/Schreibsperre ist ein Synchronisierungswerkzeug zum Schutz von Ressourcen, auf die lesend und schreibend zugegriffen werden kann. Diese Art von Sperre ist nützlich, wenn Sie mehreren Threads den gleichzeitigen Nur-Lese-Zugriff erlauben wollen, aber sobald ein Thread auf die Ressource schreiben will, müssen alle anderen Threads blockiert werden, bis der Schreibvorgang abgeschlossen ist.
In vielen Fällen ist QReadWriteLock ein direkter Konkurrent zu QMutex. QReadWriteLock ist eine gute Wahl, wenn es viele gleichzeitige Lesevorgänge gibt und das Schreiben nur selten vorkommt.
Beispiel:
QReadWriteLock lock; void ReaderThread::run() { ... lock.lockForRead(); read_file(); lock.unlock(); ... } void WriterThread::run() { ... lock.lockForWrite(); write_file(); lock.unlock(); ... }
Um sicherzustellen, dass Writer nicht für immer von Lesern blockiert werden, werden Leser, die versuchen, eine Sperre zu erhalten, nicht erfolgreich sein, wenn ein blockierter Writer auf den Zugriff wartet, selbst wenn auf die Sperre derzeit nur von anderen Lesern zugegriffen wird. Auch wenn ein Writer auf die Sperre zugreift und ein anderer Writer hinzukommt, hat dieser Writer Vorrang vor allen Lesern, die ebenfalls warten könnten.
Wie QMutex kann eine QReadWriteLock rekursiv vom gleichen Thread gesperrt werden, wenn sie mit QReadWriteLock::Recursive als QReadWriteLock::RecursionMode konstruiert wird. In solchen Fällen muss unlock() so oft aufgerufen werden, wie lockForWrite() oder lockForRead() aufgerufen wurde. Beachten Sie, dass der Sperrtyp nicht geändert werden kann, wenn Sie versuchen, rekursiv zu sperren, d.h. es ist nicht möglich, in einem Thread, der bereits für das Schreiben gesperrt ist, lesend zu sperren (und umgekehrt).
Siehe auch QReadLocker, QWriteLocker, QMutex, und QSemaphore.
Dokumentation der Mitgliedstypen
enum QReadWriteLock::RecursionMode
Konstante | Wert | Beschreibung |
---|---|---|
QReadWriteLock::Recursive | 1 | In diesem Modus kann ein Thread die gleiche QReadWriteLock mehrfach sperren. Die Sperre von QReadWriteLock wird erst nach einer entsprechenden Anzahl von unlock()-Aufrufen wieder aufgehoben. |
QReadWriteLock::NonRecursive | 0 | In diesem Modus darf ein Thread ein QReadWriteLock nur einmal sperren. |
Siehe auch QReadWriteLock().
Dokumentation der Mitgliedsfunktionen
[explicit]
QReadWriteLock::QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)
Konstruiert ein QReadWriteLock-Objekt in der angegebenen recursionMode.
Der Standardrekursionsmodus ist NonRecursive.
Siehe auch lockForRead(), lockForWrite(), und RecursionMode.
[noexcept]
QReadWriteLock::~QReadWriteLock()
Zerstört das Objekt QReadWriteLock.
Warnung: Das Aufheben einer Lese-/Schreibsperre, die gerade verwendet wird, kann zu undefiniertem Verhalten führen.
void QReadWriteLock::lockForRead()
Sperrt die Sperre zum Lesen. Diese Funktion blockiert den aktuellen Thread, wenn ein anderer Thread zum Schreiben gesperrt hat.
Es ist nicht möglich, für das Lesen zu sperren, wenn der Thread bereits für das Schreiben gesperrt ist.
Siehe auch unlock(), lockForWrite(), und tryLockForRead().
void QReadWriteLock::lockForWrite()
Sperrt die Sperre zum Schreiben. Diese Funktion blockiert den aktuellen Thread, wenn ein anderer Thread (einschließlich des aktuellen) eine Lese- oder Schreibsperre hat (es sei denn, die Sperre wurde im Modus QReadWriteLock::Recursive erstellt).
Es ist nicht möglich, für das Schreiben zu sperren, wenn der Thread bereits für das Lesen gesperrt ist.
Siehe auch unlock(), lockForRead(), und tryLockForWrite().
bool QReadWriteLock::tryLockForRead(int timeout)
Versucht, eine Sperre für das Lesen zu setzen. Diese Funktion gibt true
zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false
zurück. Wenn ein anderer Thread zum Schreiben gesperrt hat, wartet diese Funktion höchstens timeout Millisekunden, bis die Sperre verfügbar wird.
Hinweis: Die Übergabe einer negativen Zahl als timeout ist gleichbedeutend mit dem Aufruf von lockForRead(), d.h. diese Funktion wird ewig warten, bis die Sperre zum Lesen freigegeben werden kann, wenn timeout negativ ist.
Wenn die Sperre erlangt wurde, muss die Sperre mit unlock() entsperrt werden, bevor ein anderer Thread sie erfolgreich zum Schreiben sperren kann.
Es ist nicht möglich, zum Lesen zu sperren, wenn der Thread bereits zum Schreiben gesperrt hat.
Siehe auch unlock() und lockForRead().
[since 6.6]
bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout = {})
Dies ist eine überladene Funktion.
Versucht, eine Sperre für das Lesen zu erhalten. Diese Funktion gibt true
zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false
zurück. Wenn ein anderer Thread zum Schreiben gesperrt hat, wartet diese Funktion, bis timeout abläuft, um die Sperre verfügbar zu machen.
Wenn die Sperre erhalten wurde, muss die Sperre mit unlock() entsperrt werden, bevor ein anderer Thread sie erfolgreich zum Schreiben sperren kann.
Es ist nicht möglich, eine Lesesperre zu setzen, wenn der Thread bereits eine Schreibsperre gesetzt hat.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch unlock() und lockForRead().
bool QReadWriteLock::tryLockForWrite(int timeout)
Versucht, eine Sperre für das Schreiben zu erhalten. Diese Funktion gibt true
zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false
zurück. Wenn ein anderer Thread zum Lesen oder Schreiben gesperrt hat, wartet diese Funktion höchstens timeout Millisekunden, bis die Sperre wieder verfügbar ist.
Hinweis: Die Übergabe einer negativen Zahl als timeout ist gleichbedeutend mit dem Aufruf von lockForWrite(), d.h. diese Funktion wird ewig warten, bis die Sperre zum Schreiben freigegeben werden kann, wenn timeout negativ ist.
Wenn die Sperre erlangt wurde, muss die Sperre mit unlock() entsperrt werden, bevor ein anderer Thread sie erfolgreich sperren kann.
Es ist nicht möglich, zum Schreiben zu sperren, wenn der Thread bereits zum Lesen gesperrt hat.
Siehe auch unlock() und lockForWrite().
[since 6.6]
bool QReadWriteLock::tryLockForWrite(QDeadlineTimer timeout = {})
Dies ist eine überladene Funktion.
Versucht, eine Sperre für das Schreiben zu erhalten. Diese Funktion gibt true
zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false
zurück. Wenn ein anderer Thread zum Lesen oder Schreiben gesperrt hat, wartet diese Funktion, bis timeout abläuft, um die Sperre verfügbar zu machen.
Wenn die Sperre erhalten wurde, muss die Sperre mit unlock() entsperrt werden, bevor ein anderer Thread sie erfolgreich sperren kann.
Es ist nicht möglich, eine Schreibsperre zu setzen, wenn der Thread bereits eine Lesesperre gesetzt hat.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch unlock() und lockForWrite().
void QReadWriteLock::unlock()
Entriegelt das Schloss.
Der Versuch, ein nicht gesperrtes Schloss zu entsperren, ist ein Fehler und führt zum Programmabbruch.
Siehe auch lockForRead(), lockForWrite(), tryLockForRead(), und tryLockForWrite().
© 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.