功能与实现原理
允许多个线程同时加读锁,但只允许一个线程加写锁,可以写嵌套,即一个线程里面加写锁了,可以继续在这个线程加写锁,不会阻塞。
当有线程在读取时,写入线程阻塞,当写入线程执行时,所有的读取线程都被阻塞。
允许嵌套加锁
- 当前线程写入加锁时可以嵌套加读锁或写锁
- 当前线程读取加锁时可以嵌套加读锁,但不能嵌套加写锁,否则当前线程会陷入死锁,原理为:已经作为只读区了,就不应该存在写了
加读锁的时候:
- 判断当前线程是不是使用写锁的线程,如果是的话,可以加读锁。
- 如果当前线程不是使用写锁的线程,需要等待写锁线程使用完、以及正在等待写的先使用完写锁,因为写的优先级高。
加写锁的时候:
- 判断当前线程是不是使用写锁的线程,如果是的话,可以加写锁,因为允许嵌套写。
- 如果当前线程不是使用写锁的线程,需要等待读锁线程以及写锁线程都使用完,但可以不管正在等待读写的线程,因为自己先从条件变量抢到了锁。
释放读锁的时候:
- 如果有写锁正在等待,通知它
释放写锁的时候:
- 注意嵌套写锁全都释放了以后,才是真正的释放。
- 释放后,如果有写锁正在等待,先通知写锁,因为写锁的优先级高。
- 如果有读锁正在等待,再通知读锁。
实现
1 | void RWLock::ReadLock() |