c++ 17 后 标准库提供了std::shared_mutex, 其实就是读写锁。
这里记一下读写锁的特性
- 没有线程持有写锁时,所有线程都可以一起持有读锁
- 有线程持有写锁时,所有的读锁和写锁都会阻塞
- 有线程持有读锁时,写锁都会阻塞,读锁可以直接持有
因为不同线程同时读数据是没有数据一致性的问题,只有在有线程写数据时才会有数一致性问题, 而互斥锁不管是读还是写,都会独占资源的所有权,当我们读多写少的时候,就可以使用读写锁来提升性能
头文件
#include <shared_mutex>
成员函数
读锁
- lock() 加写锁, 会阻塞直到加锁成功
- try_lock() 尝试加写锁,加锁成功或失败都会返回
- unlock() 解除写锁
写锁
- lock_shared() 加读锁,会阻塞直到加锁成功
- try_lock_shared() 尝试加读锁,加锁成功或失败都会返回
- unlock_shared() 解除读锁
与 std::lock_guard 、std::unique_lock 或 std::shared_lock 配合使用。
1. 配合 std::lock_guard 、std::unique_lock, 在作用域范围内加的是写锁
2. 配合 std::shared_lock 在作用域范围内加的是读锁
示例
shared_lock<shared_mutex> slock(smutex); // 在作用域内加读锁, 超出作用域自动解锁
unique_lock<shared_mutex> ulock(smutex); // 在作用域内加写锁, 超出作用域自动解锁
lock_guard<shared_mutex> lock(smutex); // 这个也是写锁, 超出作用域自动解锁