QReadWriteLock Class
Die Klasse „QReadWriteLock“ bietet Lese-Schreib-Sperren. Mehr dazu...
| Header: | #include <QReadWriteLock> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Erbt von: | QBasicReadWriteLock |
- Liste aller Mitglieder, einschließlich der geerbten Mitglieder
- QReadWriteLock ist Teil der Threading-Klassen.
Hinweis: Alle Funktionen dieser Klasse sind threadsicher.
Ö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() |
Ausführliche Beschreibung
Eine Lese-Schreib-Sperre ist ein Synchronisationswerkzeug zum Schutz von Ressourcen, auf die sowohl zum Lesen als auch zum Schreiben zugegriffen werden kann. Diese Art von Sperre ist nützlich, wenn Sie mehreren Threads den gleichzeitigen Lesezugriff ermöglichen möchten, aber sobald ein Thread in die Ressource schreiben möchte, 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 viele gleichzeitige Lesevorgänge stattfinden und Schreibvorgänge nur selten auftreten.
Beispiel:
QReadWriteLock lock;
void ReaderThread::run()
{
//...
lock.lockForRead();
read_file();
lock.unlock();
//...
}
void WriterThread::run()
{
//...
lock.lockForWrite();
write_file();
lock.unlock();
//...
}Um sicherzustellen, dass Schreib-Threads nicht dauerhaft von Lese-Threads blockiert werden, können Lese-Threads, die versuchen, eine Sperre zu erwerben, dies nicht tun, wenn ein blockierter Schreib-Thread auf Zugriff wartet – selbst wenn die Sperre derzeit nur von anderen Lese-Threads genutzt wird. Wenn zudem ein Schreib-Thread auf die Sperre zugreift und ein weiterer Schreib-Thread hinzukommt, hat dieser Schreib-Thread Vorrang vor allen Lese-Threads, die möglicherweise ebenfalls warten.
Ähnlich wie bei ` QMutex` kann ein `QReadWriteLock` vom selben Thread rekursiv gesperrt werden, wenn er mit ` QReadWriteLock::Recursive ` als ` QReadWriteLock::RecursionMode` erstellt wurde. In solchen Fällen muss ` unlock()` genauso oft aufgerufen werden, wie ` lockForWrite()` oder ` lockForRead()` aufgerufen wurde. Beachten Sie, dass der Sperrtyp bei rekursiven Sperrversuchen nicht geändert werden kann, d. h., es ist nicht möglich, in einem Thread, der bereits für das Schreiben gesperrt ist, eine Lesesperre zu setzen (und umgekehrt).
Siehe auch QReadLocker, QWriteLocker, QMutex und QSemaphore.
Dokumentation zu Mitgliedstypen
enum QReadWriteLock::RecursionMode
| Konstante | Wert | Beschreibung |
|---|---|---|
QReadWriteLock::Recursive | 1 | In diesem Modus kann ein Thread denselben „ QReadWriteLock “ mehrfach sperren. Der „ QReadWriteLock “ wird erst entsperrt, wenn die entsprechende Anzahl von „ unlock()“-Aufrufen erfolgt ist. |
QReadWriteLock::NonRecursive | 0 | In diesem Modus darf ein Thread ein ` QReadWriteLock ` nur einmal sperren. |
Siehe auch QReadWriteLock().
Dokumentation zu den Member-Funktionen
[explicit] QReadWriteLock::QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)
Erstellt ein QReadWriteLock-Objekt im angegebenen recursionMode.
Der Standard-Rekursionsmodus ist „ NonRecursive “.
Siehe auch „ lockForRead()“, „ lockForWrite()“ und „ RecursionMode “.
[noexcept] QReadWriteLock::~QReadWriteLock()
Löst das „ QReadWriteLock “-Objekt auf.
Warnung: Das Auflösen einer Lese-Schreib-Sperre, die gerade verwendet wird, kann zu undefiniertem Verhalten führen.
void QReadWriteLock::lockForRead()
Sperrt das Schloss für Lesezugriffe. Diese Funktion blockiert den aktuellen Thread, wenn ein anderer Thread das Schloss bereits für Schreibzugriffe gesperrt hat.
Es ist nicht möglich, eine Lese-Sperre zu setzen, wenn der Thread bereits eine Schreib-Sperre gesetzt hat.
Siehe auch unlock(), lockForWrite() und tryLockForRead().
void QReadWriteLock::lockForWrite()
Sperrt die Sperre für Schreibzugriffe. Diese Funktion blockiert den aktuellen Thread, wenn ein anderer Thread (einschließlich des aktuellen) die Sperre zum Lesen oder Schreiben gesperrt hat (es sei denn, die Sperre wurde im Modus „ QReadWriteLock::Recursive “ erstellt).
Es ist nicht möglich, eine Schreibsperre zu setzen, wenn der Thread bereits eine Lesesperre gesetzt hat.
Siehe auch „ unlock()“, „ lockForRead()“ und „ tryLockForWrite()“.
bool QReadWriteLock::tryLockForRead(int timeout)
Versucht, eine Sperre zum Lesen zu erwerben. Diese Funktion gibt „ true “ zurück, wenn die Sperre erworben wurde; andernfalls gibt sie „ false “ zurück. Wenn ein anderer Thread die Sperre zum Schreiben erworben hat, wartet diese Funktion höchstens „ timeout “ Millisekunden, bis die Sperre verfügbar wird.
Hinweis: Die Übergabe einer negativen Zahl als „ timeout “ entspricht dem Aufruf von „ lockForRead()“, d. h., diese Funktion wartet unendlich lange, bis die Sperre zum Lesen gesperrt werden kann, wenn „ timeout “ negativ ist.
Wurde die Sperre erworben, muss sie mit ` unlock()` freigegeben werden, bevor ein anderer Thread sie erfolgreich zum Schreiben sperren kann.
Es ist nicht möglich, eine Sperre zum Lesen zu setzen, wenn der Thread bereits eine Sperre zum Schreiben gesetzt hat.
Siehe auch „ unlock()“ und „ lockForRead()“.
[since 6.6] bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout = {})
Versucht, eine Sperre zum Lesen zu setzen. Diese Funktion gibt ` true ` zurück, wenn die Sperre erfolgreich gesetzt wurde; andernfalls gibt sie ` false` zurück. Wenn ein anderer Thread eine Schreibsperre gesetzt hat, wartet diese Funktion, bis ` timeout ` abgelaufen ist, damit die Sperre verfügbar wird.
Wurde die Sperre erhalten, muss sie mit ` unlock()` freigegeben werden, bevor ein anderer Thread sie erfolgreich zum Schreiben sperren kann.
Es ist nicht möglich, eine Sperre zum Lesen zu setzen, wenn der Thread bereits eine Schreibsperre gesetzt hat.
Dies ist eine überladene Funktion.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch ` unlock()` und ` lockForRead()`.
bool QReadWriteLock::tryLockForWrite(int timeout)
Versucht, eine Sperre zum Schreiben zu erwerben. Diese Funktion gibt ` true ` zurück, wenn die Sperre erworben wurde; andernfalls gibt sie ` false` zurück. Wenn ein anderer Thread die Sperre zum Lesen oder Schreiben erworben hat, wartet diese Funktion höchstens ` timeout ` Millisekunden, bis die Sperre verfügbar wird.
Hinweis: Die Übergabe einer negativen Zahl als timeout entspricht dem Aufruf von lockForWrite(), d. h., diese Funktion wartet unendlich lange, bis die Sperre zum Schreiben gesperrt werden kann, wenn timeout negativ ist.
Wurde die Sperre erworben, muss sie mit ` unlock()` freigegeben 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.
Siehe auch „ unlock()“ und „ lockForWrite()“.
[since 6.6] bool QReadWriteLock::tryLockForWrite(QDeadlineTimer timeout = {})
Versucht, die Sperre zum Schreiben zu erwerben. Diese Funktion gibt ` true ` zurück, wenn die Sperre erworben wurde; andernfalls gibt sie ` false` zurück. Wenn ein anderer Thread die Sperre zum Lesen oder Schreiben erworben hat, wartet diese Funktion, bis ` timeout ` abgelaufen ist, damit die Sperre verfügbar wird.
Wurde die Sperre erhalten, muss sie mit ` unlock()` freigegeben 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.
Dies ist eine überladene Funktion.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch ` unlock()` und ` lockForWrite()`.
void QReadWriteLock::unlock()
Entriegelt das Schloss.
Der Versuch, ein Schloss zu entriegeln, das nicht verriegelt ist, ist ein Fehler und führt zum Abbruch des Programms.
Siehe auch lockForRead(), lockForWrite(), tryLockForRead() und tryLockForWrite().
© 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.