QReadWriteLock Class
La classe QReadWriteLock permet de mettre en place un verrouillage en lecture-écriture. En savoir plus...
| En-tête : | #include <QReadWriteLock> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Hérite de : | QBasicReadWriteLock |
- Liste de tous les membres, y compris les membres hérités
- QReadWriteLock fait partie des classes de multithreading.
Remarque : toutes les fonctions de cette classe sont sûres pour les threads.
Types publics
| enum | RecursionMode { Recursive, NonRecursive } |
Fonctions publiques
| 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() |
Description détaillée
Un verrou en lecture-écriture est un outil de synchronisation permettant de protéger les ressources accessibles en lecture et en écriture. Ce type de verrou est utile si vous souhaitez autoriser plusieurs threads à accéder simultanément à la ressource en lecture seule, mais dès qu’un thread souhaite écrire sur la ressource, tous les autres threads doivent être bloqués jusqu’à ce que l’écriture soit terminée.
Dans de nombreux cas, QReadWriteLock est un concurrent direct de QMutex. QReadWriteLock est un bon choix s'il y a de nombreuses lectures simultanées et que les écritures sont peu fréquentes.
Exemple :
QReadWriteLock lock;
void ReaderThread::run()
{
//...
lock.lockForRead();
read_file();
lock.unlock();
//...
}
void WriterThread::run()
{
//...
lock.lockForWrite();
write_file();
lock.unlock();
//...
}Pour garantir que les threads d'écriture ne soient pas bloqués indéfiniment par les threads de lecture, les threads de lecture tentant d’obtenir un verrou échoueront s’il existe un thread d’écriture bloqué en attente d’accès, même si le verrou n’est actuellement accédé que par d’autres threads de lecture. De même, si le verrou est accédé par un thread d’écriture et qu’un autre thread d’écriture arrive, ce dernier aura la priorité sur tous les threads de lecture qui pourraient également être en attente.
À l’instar de ` QMutex`, un `QReadWriteLock` peut être verrouillé de manière récursive par le même thread lorsqu’il est construit avec ` QReadWriteLock::Recursive `, comme dans ` QReadWriteLock::RecursionMode`. Dans de tels cas, ` unlock()` doit être appelé autant de fois qu’` lockForWrite()` ou ` lockForRead()` a été appelé. Notez que le type de verrou ne peut pas être modifié lors d’un verrouillage récursif, c’est-à-dire qu’il n’est pas possible de verrouiller en lecture dans un thread qui est déjà verrouillé en écriture (et inversement).
Voir également QReadLocker, QWriteLocker, QMutex et QSemaphore.
Documentation sur les types membres
enum QReadWriteLock::RecursionMode
| Constante | Valeur | Description |
|---|---|---|
QReadWriteLock::Recursive | 1 | Dans ce mode, un thread peut verrouiller plusieurs fois la même QReadWriteLock. L'QReadWriteLock ne sera déverrouillée qu'après un nombre correspondant d'appels à la fonction unlock(). |
QReadWriteLock::NonRecursive | 0 | Dans ce mode, un thread ne peut verrouiller une QReadWriteLock qu’une seule fois. |
Voir également QReadWriteLock().
Documentation des fonctions membres
[explicit] QReadWriteLock::QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)
Crée un objet QReadWriteLock dans l'recursionMode spécifié.
Le mode de récursivité par défaut est NonRecursive.
Voir également lockForRead(), lockForWrite() et RecursionMode.
[noexcept] QReadWriteLock::~QReadWriteLock()
Détruit l'objet ` QReadWriteLock `.
Avertissement : la destruction d'un verrou en lecture-écriture en cours d'utilisation peut entraîner un comportement indéfini.
void QReadWriteLock::lockForRead()
Verrouille le verrou en lecture. Cette fonction bloquera le thread actuel si un autre thread a verrouillé le verrou en écriture.
Il n'est pas possible de verrouiller en lecture si le thread a déjà verrouillé en écriture.
Voir également unlock(), lockForWrite() et tryLockForRead().
void QReadWriteLock::lockForWrite()
Verrouille le verrou en écriture. Cette fonction bloquera le thread actuel si un autre thread (y compris le thread actuel) a verrouillé le verrou en lecture ou en écriture (à moins que le verrou n'ait été créé en mode « QReadWriteLock::Recursive »).
Il n'est pas possible de verrouiller en écriture si le thread est déjà verrouillé en lecture.
Voir également unlock(), lockForRead() et tryLockForWrite().
bool QReadWriteLock::tryLockForRead(int timeout)
Tente d’obtenir un verrou en lecture. Cette fonction renvoie true si le verrou a été obtenu ; sinon, elle renvoie false. Si un autre thread a verrouillé le verrou en écriture, cette fonction attendra au maximum timeout millisecondes que le verrou se libère.
Remarque : passer un nombre négatif comme timeout revient à appeler lockForRead(), c'est-à-dire que cette fonction attendra indéfiniment que le verrou puisse être verrouillé en lecture lorsque timeout est négatif.
Si le verrou a été obtenu, il doit être déverrouillé à l’aide de ` unlock()` avant qu’un autre thread puisse le verrouiller avec succès en écriture.
Il n’est pas possible de verrouiller en lecture si le thread a déjà verrouillé en écriture.
Voir également unlock() et lockForRead().
[since 6.6] bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout = {})
Tente d’obtenir un verrou en lecture. Cette fonction renvoie ` true ` si le verrou a été obtenu ; sinon, elle renvoie ` false`. Si un autre thread a obtenu un verrou en écriture, cette fonction attendra que ` timeout ` expire pour que le verrou devienne disponible.
Si le verrou a été obtenu, il doit être déverrouillé à l’aide de ` unlock()` avant qu’un autre thread puisse le verrouiller avec succès en écriture.
Il n’est pas possible de verrouiller en lecture si le thread est déjà verrouillé en écriture.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.6.
Voir également unlock() et lockForRead().
bool QReadWriteLock::tryLockForWrite(int timeout)
Tente d'obtenir un verrou en écriture. Cette fonction renvoie true si le verrou a été obtenu ; sinon, elle renvoie false. Si un autre thread a verrouillé le bloc en lecture ou en écriture, cette fonction attendra au maximum timeout millisecondes que le verrou se libère.
Remarque : passer un nombre négatif comme timeout revient à appeler lockForWrite(), c’est-à-dire que cette fonction attendra indéfiniment que le verrou puisse être verrouillé en écriture lorsque timeout est négatif.
Si le verrou a été obtenu, il doit être déverrouillé à l’aide de unlock() avant qu’un autre thread puisse le verrouiller avec succès.
Il n’est pas possible de verrouiller en écriture si le thread a déjà verrouillé en lecture.
Voir également unlock() et lockForWrite().
[since 6.6] bool QReadWriteLock::tryLockForWrite(QDeadlineTimer timeout = {})
Tente d'obtenir un verrou en écriture. Cette fonction renvoie true si le verrou a été obtenu ; sinon, elle renvoie false. Si un autre thread a verrouillé le verrou en lecture ou en écriture, cette fonction attendra que timeout expire pour que le verrou devienne disponible.
Si le verrou a été obtenu, il doit être déverrouillé à l’aide de unlock() avant qu’un autre thread puisse le verrouiller avec succès.
Il n’est pas possible de verrouiller en écriture si le thread est déjà verrouillé en lecture.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.6.
Voir également unlock() et lockForWrite().
void QReadWriteLock::unlock()
Déverrouille la serrure.
Tenter de déverrouiller un verrou qui n'est pas verrouillé constitue une erreur et entraînera l'arrêt du programme.
Voir également lockForRead(), lockForWrite(), tryLockForRead() et 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.