std::shared_mutex

默认分类 · 2024-06-24 · 149 人浏览

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); // 这个也是写锁, 超出作用域自动解锁
简记
Theme Jasmine by Kent Liao