Qt:QReadWriteLock
0、说明
QReadWriteLock类提供了读写锁。
读写锁是一种保护那些可以读写的资源的同步工具,如果有多个线程同时要进行读操作,但是有一个线程想要写入,那么所有其他线程都会等待直到这个写线程完成。
在许多情况下,QReadWriteLock是QMutex的竞争者。在读写并发操作不是很频繁时,用QReadWriteLock将是一个很好的选择。
例子
QReadWriteLock lock; void ReaderThread::run() { ... lock.lockForRead(); read_file(); lock.unlock(); ... } void WriterThread::run() { ... lock.lockForWrite(); write_file(); lock.unlock(); ... }
为了避免写进程永远被读进程阻塞,当有写进程由于等待而被阻塞时,读进程将不会获得锁,即使现在该锁正在被其他读进程设置。另外,当锁正在被一个写进程设置,此时又有另一个写进程进入时,新的写进程将获得比其他读进程更高的优先级。
就像QMutex那样,QReadWriteLock如果在构造时指定QReadWriteLock::Recursive as QReadWriteLock::RecursionMode,那么允许某个线程多次加锁。这种情况下,调用了多少次lockForWrite() 或 lockForRead(),就要有多少个unlock()。不能在一个线程中同时加读锁和写锁,这两种锁只能先后进行而不能同时进行。
1、模块和加载项
Header: | #include <QReadWriteLock> |
qmake: | QT += core |
2、构造
QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive) | 用给定recursionMode构造一个QReadWriteLock对象 |
3、静态字段
enum | RecursionMode { Recursive, NonRecursive } | 是否允许多次加锁 |
6、实例方法
返回值类型 |
方法 |
说明 |
void | lockForRead() | 读锁 |
void | lockForWrite() | 写锁 |
bool |
tryLockForRead(int timeout) |
尝试加读锁,成功时返回true,如果另一个进程正在写,返回false 尝试加读锁,如果另一个进程正在写,会等待至多timeout毫秒,成功返回true,否则false |
bool |
tryLockForWrite(int timeout) |
尝试加写锁 尝试加写锁,最多等timeout毫秒 |
void | unlock() | 解锁 |