Sur cette page

QReadWriteLock Class

La classe QReadWriteLock fournit un verrouillage en lecture-écriture. Plus d'informations...

En-tête : #include <QReadWriteLock>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Hérite : QBasicReadWriteLock

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 de lecture-écriture est un outil de synchronisation destiné à protéger les ressources accessibles en lecture et en écriture. Ce type de verrou est utile si vous voulez permettre à plusieurs threads d'avoir un accès simultané en lecture seule, mais dès qu'un thread veut é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 beaucoup de lectures simultanées et que l'écriture est peu fréquente.

Exemple :

QReadWriteLock lock;

void ReaderThread::run()
{
    //...
    lock.lockForRead();
    read_file();
    lock.unlock();
    //...
}

void WriterThread::run()
{
    //...
    lock.lockForWrite();
    write_file();
    lock.unlock();
    //...
}

Pour s'assurer que les auteurs ne sont pas bloqués indéfiniment par les lecteurs, les lecteurs qui tentent d'obtenir un verrou n'y parviendront pas s'il y a un auteur bloqué qui attend l'accès, même si le verrou n'est actuellement accessible qu'à d'autres lecteurs. De plus, si un écrivain accède au verrou et qu'un autre écrivain entre en jeu, ce dernier aura la priorité sur tous les lecteurs qui pourraient également être en attente.

Comme QMutex, un QReadWriteLock peut être verrouillé récursivement par le même thread lorsqu'il est construit avec QReadWriteLock::Recursive comme QReadWriteLock::RecursionMode. Dans ce cas, unlock() doit être appelé le même nombre de fois que lockForWrite() ou lockForRead(). Notez que le type de verrouillage ne peut pas être modifié lorsque vous essayez de verrouiller de manière récursive, c'est-à-dire qu'il n'est pas possible de verrouiller en lecture dans un thread qui a déjà verrouillé en écriture (et vice versa).

Voir aussi QReadLocker, QWriteLocker, QMutex, et QSemaphore.

Documentation sur les types de membres

enum QReadWriteLock::RecursionMode

ConstanteValeurDescription
QReadWriteLock::Recursive1Dans ce mode, un thread peut verrouiller le même QReadWriteLock plusieurs fois. L'adresse QReadWriteLock ne sera pas déverrouillée tant qu'un nombre correspondant d'appels à unlock() n'aura pas été effectué.
QReadWriteLock::NonRecursive0Dans ce mode, un thread ne peut verrouiller une QReadWriteLock qu'une seule fois.

Voir aussi QReadWriteLock().

Documentation sur les fonctions membres

[explicit] QReadWriteLock::QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)

Construit un objet QReadWriteLock dans le format donné recursionMode.

Le mode de récursivité par défaut est NonRecursive.

Voir aussi lockForRead(), lockForWrite(), et RecursionMode.

[noexcept] QReadWriteLock::~QReadWriteLock()

Détruit l'objet QReadWriteLock.

Attention : 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 pour la lecture. Cette fonction bloque le fil d'exécution actuel si un autre fil d'exécution a verrouillé l'é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()

Bloque le verrou en écriture. Cette fonction bloque le thread actuel si un autre thread (y compris le thread actuel) a verrouillé en lecture ou en écriture (à moins que le verrou n'ait été créé à l'aide du mode QReadWriteLock::Recursive ).

Il n'est pas possible de verrouiller en écriture si le thread a déjà verrouillé en lecture.

Voir aussi unlock(), lockForRead() et tryLockForWrite().

bool QReadWriteLock::tryLockForRead(int timeout)

Tente de verrouiller pour la lecture. Cette fonction renvoie true si le verrou a été obtenu ; sinon, elle renvoie false. Si un autre thread a verrouillé en écriture, cette fonction attendra au maximum timeout millisecondes pour que le verrou devienne disponible.

Remarque : le fait de passer un nombre négatif à timeout équivaut à appeler lockForRead(), c'est-à-dire que cette fonction attendra indéfiniment jusqu'à ce que le verrou puisse être verrouillé pour la lecture lorsque timeout est négatif.

Si le verrou a été obtenu, il doit être déverrouillé avec unlock() avant qu'un autre thread puisse le verrouiller pour l'é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 de verrouiller pour la lecture. Cette fonction renvoie true si le verrou a été obtenu ; sinon, elle renvoie false. Si un autre thread a verrouillé pour l'écriture, cette fonction attendra jusqu'à ce 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 en écriture.

Il n'est pas possible de verrouiller en lecture si le thread a déjà verrouillé en écriture.

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.6.

Voir aussi unlock() et lockForRead().

bool QReadWriteLock::tryLockForWrite(int timeout)

Tente de verrouiller l'écriture. Cette fonction renvoie true si le verrou a été obtenu, sinon elle renvoie false. Si un autre thread a verrouillé en lecture ou en écriture, cette fonction attendra au maximum timeout millisecondes pour que le verrou devienne disponible.

Remarque : le fait de passer un nombre négatif à timeout équivaut à appeler lockForWrite(), c'est-à-dire que cette fonction attendra indéfiniment que le verrou puisse être verrouillé pour l'écriture lorsque timeout est négatif.

Si le verrou a été obtenu, il doit être déverrouillé avec 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 de verrouiller l'écriture. Cette fonction renvoie true si le verrou a été obtenu ; sinon, elle renvoie false. Si un autre thread a verrouillé 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 a déjà verrouillé en lecture.

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.6.

Voir aussi unlock() et lockForWrite().

void QReadWriteLock::unlock()

Déverrouille la serrure.

Toute tentative de déverrouillage d'un verrou qui n'est pas verrouillé est une erreur et entraîne 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.