一、描述
读写锁是一种同步工具,用于保护可以进行读写访问的资源。这种索允许多个线程同时进行只读访问,但是一旦一个线程想要写入资源,则必须阻止所有其他线程,直到写入完成。
例:
QReadWriteLock lock;
void ReaderThread::run()
{
...
lock.lockForRead();
read_file();
lock.unlock();
...
}
void WriterThread::run()
{
...
lock.lockForWrite();
write_file();
lock.unlock();
...
}
二、类型成员
1、enum QReadWriteLock::RecursionMode:递归模式
- Recursive:递归模式。一个线程可以多次锁定同一个读写锁,并且在进行相应数量的 unlock() 调用之前读写锁不会被解锁。
- NonRecursive:非递归模式,默认值。一个线程只能锁定一个读写锁一次。
三、成员函数
1、~QReadWriteLock()
销毁读写锁。销毁正在使用的读写锁会导致未定义行为。
2、void lockForRead()
锁定读取锁。如果另一个线程已锁定以进行写入,则此函数将阻塞当前线程。如果线程已经锁定写入,则无法锁定读取。
3、void lockForWrite()
锁定写入锁。如果另一个线程(包括当前线程)已锁定读取或写入(除非已使用Recursive 模式创建锁),则此函数将阻塞当前线程。如果线程已经为读取而锁定,则不会为写入而锁定。
4、bool tryLockForRead()
尝试锁定读取。如果获得了锁返回true。如果另一个线程已锁定写入,则锁定尝试将失败,会直接返回false而不是等待锁变为可用,即它不会阻塞(与lockForRead()的不同)。
5、bool tryLockForRead(int timeout)
重载函数。与上面相比,如果另一个线程已锁定写入,则会等待timeout毫秒看是不是锁定写入已经解除了。
6、bool tryLockForWrite()
尝试锁定写入。 如果获得了锁返回true,否则立即返回 false。如果另一个线程已锁定以进行读取或写入,则锁定尝试将失败。
7、bool tryLockForWrite(int timeout)
操作函数,与上面相比,如果如果另一个线程已锁定以进行读取或写入,则等待timeout毫秒看锁定是否已经解除了。
8、void unlock()
解锁。尝试解除未锁定的锁是会导致程序终止。