QReadWriteLock Class
La clase QReadWriteLock proporciona bloqueo de lectura-escritura. Más...
| Cabecera: | #include <QReadWriteLock> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Hereda de: | QBasicReadWriteLock |
- Lista de todos los miembros, incluyendo los heredados
- QReadWriteLock es parte de la clase Threading Classes.
Nota: Todas las funciones de esta clase son thread-safe.
Tipos Públicos
| enum | RecursionMode { Recursive, NonRecursive } |
Funciones Públicas
| 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() |
Descripción Detallada
Un bloqueo de lectura-escritura es una herramienta de sincronización para proteger recursos que pueden ser accedidos para lectura y escritura. Este tipo de bloqueo es útil si se desea permitir que varios subprocesos tengan acceso simultáneo de sólo lectura, pero tan pronto como un subproceso quiere escribir en el recurso, todos los demás subprocesos deben ser bloqueados hasta que se complete la escritura.
En muchos casos, QReadWriteLock es un competidor directo de QMutex. QReadWriteLock es una buena opción si hay muchas lecturas concurrentes y la escritura ocurre con poca frecuencia.
Ejemplo:
QReadWriteLock lock; void ReaderThread::run() { //... lock.lockForRead(); read_file(); lock.unlock(); //... } void WriterThread::run() { //... lock.lockForWrite(); write_file(); lock.unlock(); //... }
Para asegurar que los escritores no son bloqueados para siempre por los lectores, los lectores que intenten obtener un bloqueo no tendrán éxito si hay un escritor bloqueado esperando acceso, incluso si el bloqueo es actualmente sólo accedido por otros lectores. Además, si un escritor accede al bloqueo y entra otro escritor, ese escritor tendrá prioridad sobre cualquier lector que también pueda estar esperando.
Al igual que QMutex, un QReadWriteLock puede ser bloqueado recursivamente por el mismo thread cuando se construye con QReadWriteLock::Recursive como QReadWriteLock::RecursionMode. En tales casos, unlock() debe ser llamado el mismo número de veces que lockForWrite() o lockForRead(). Nótese que el tipo de bloqueo no puede cambiarse cuando se intenta bloquear recursivamente, es decir, no es posible bloquear para lectura en un hilo que ya ha bloqueado para escritura (y viceversa).
Véase también QReadLocker, QWriteLocker, QMutex, y QSemaphore.
Documentación de tipos de miembros
enum QReadWriteLock::RecursionMode
| Constante | Valor | Descripción |
|---|---|---|
QReadWriteLock::Recursive | 1 | En este modo, un hilo puede bloquear el mismo QReadWriteLock varias veces. El QReadWriteLock no se desbloqueará hasta que se haya realizado un número correspondiente de llamadas a unlock(). |
QReadWriteLock::NonRecursive | 0 | En este modo, un subproceso sólo puede bloquear un QReadWriteLock una vez. |
Véase también QReadWriteLock().
Documentación de las funciones miembro
[explicit] QReadWriteLock::QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)
Construye un objeto QReadWriteLock en la dirección recursionMode.
El modo de recursión por defecto es NonRecursive.
Ver también lockForRead(), lockForWrite(), y RecursionMode.
[noexcept] QReadWriteLock::~QReadWriteLock()
Destruye el objeto QReadWriteLock.
Advertencia: Destruir un bloqueo de lectura-escritura que está en uso puede provocar un comportamiento indefinido.
void QReadWriteLock::lockForRead()
Bloquea el bloqueo para lectura. Esta función bloqueará el hilo actual si otro hilo ha bloqueado para escritura.
No es posible bloquear para lectura si el hilo ya ha bloqueado para escritura.
Véase también unlock(), lockForWrite(), y tryLockForRead().
void QReadWriteLock::lockForWrite()
Bloquea el bloqueo para escritura. Esta función bloqueará el subproceso actual si otro subproceso (incluido el actual) ha bloqueado para lectura o escritura (a menos que el bloqueo se haya creado utilizando el modo QReadWriteLock::Recursive ).
No es posible bloquear para escritura si el hilo ya ha bloqueado para lectura.
Véase también unlock(), lockForRead(), y tryLockForWrite().
bool QReadWriteLock::tryLockForRead(int timeout)
Intenta bloquear para lectura. Esta función devuelve true si se ha obtenido el bloqueo; en caso contrario, devuelve false. Si otro hilo ha bloqueado para escribir, esta función esperará como máximo timeout milisegundos a que el bloqueo esté disponible.
Nota: Pasar un número negativo como timeout equivale a llamar a lockForRead(), es decir, esta función esperará eternamente hasta que se pueda bloquear para lectura cuando timeout es negativo.
Si el bloqueo fue obtenido, el bloqueo debe ser desbloqueado con unlock() antes de que otro hilo pueda bloquearlo con éxito para escribir.
No es posible bloquear para lectura si el hilo ya ha bloqueado para escritura.
Véase también unlock() y lockForRead().
[since 6.6] bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout = {})
Intenta bloquear para lectura. Esta función devuelve true si se ha obtenido el bloqueo; en caso contrario, devuelve false. Si otro hilo ha bloqueado para escritura, esta función esperará hasta que timeout expire para que el bloqueo esté disponible.
Si el bloqueo fue obtenido, el bloqueo debe ser desbloqueado con unlock() antes de que otro hilo pueda bloquearlo con éxito para escribir.
No es posible bloquear para lectura si el hilo ya ha bloqueado para escritura.
Esta es una función sobrecargada.
Esta función se introdujo en Qt 6.6.
Ver también unlock() y lockForRead().
bool QReadWriteLock::tryLockForWrite(int timeout)
Intenta bloquear la escritura. Esta función devuelve true si se ha obtenido el bloqueo; en caso contrario, devuelve false. Si otro hilo ha bloqueado para lectura o escritura, esta función esperará como máximo timeout milisegundos a que el bloqueo esté disponible.
Nota: Pasar un número negativo como timeout equivale a llamar a lockForWrite(), es decir, esta función esperará eternamente hasta que se pueda bloquear para escribir cuando timeout es negativo.
Si el bloqueo fue obtenido, el bloqueo debe ser desbloqueado con unlock() antes de que otro hilo pueda bloquearlo con éxito.
No es posible bloquear para escritura si el hilo ya ha bloqueado para lectura.
Véase también unlock() y lockForWrite().
[since 6.6] bool QReadWriteLock::tryLockForWrite(QDeadlineTimer timeout = {})
Intenta bloquear la escritura. Esta función devuelve true si se ha obtenido el bloqueo; en caso contrario, devuelve false. Si otro hilo ha bloqueado para lectura o escritura, esta función esperará hasta que timeout expire para que el bloqueo esté disponible.
Si el bloqueo fue obtenido, el bloqueo debe ser desbloqueado con unlock() antes de que otro hilo pueda bloquearlo con éxito.
No es posible bloquear para escritura si el hilo ya ha bloqueado para lectura.
Esta es una función sobrecargada.
Esta función se introdujo en Qt 6.6.
Ver también unlock() y lockForWrite().
void QReadWriteLock::unlock()
Desbloquea la cerradura.
Intentar desbloquear un candado que no está bloqueado es un error y provocará la finalización del programa.
Véase también lockForRead(), lockForWrite(), tryLockForRead() y 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.