c++ 读写锁使用详解
std::shared_mutex c++17
- 头文件
#include <shared_mutex>
。 - 用于实现共享和独占访问的互斥锁。
- 提供了一种更加灵活的机制,允许多个线程在共享模式下读取数据,但只允许单个线程在独占模式下写入或修改数据。
- 与 std::mutex 相比,具有以下额外特性:
- 多个线程可以同时以共享模式(shared mode)持有锁,允许并发读取操作。
- 只有一个线程可以以独占模式(exclusive mode)持有锁,允许写入或修改操作。
- 当一个线程以独占模式持有锁时,其他线程无法以共享模式持有锁,它们必须等待独占模式的线程释放锁。
- 当一个线程以共享模式持有锁时,其他线程可以以共享模式持有锁,允许并发读取操作。
成员函数
lock
:锁定互斥,若互斥不可用则阻塞。try_lock
:尝试锁定互斥,若互斥不可用则返回。unlock
:解锁互斥。lock_shared
:以共享模式锁定互斥,若互斥不可用则阻塞。try_lock_shared
:尝试以共享模式锁定互斥,若互斥不可用则返回。unlock_shared
:解锁以共享模式锁定的互斥。
推荐使用方法
- 当使用共享模式时,配合 std::shared_lock 使用。
- 当使用独占模式时,配合 std::lock_guard,std::unique_lock 或者 std::scoped_lock 使用。
示例代码
-
以下示例演示了两个读取线程(reader)以共享模式持有 mutex,并同时读取 shared_data 的值。写入线程(writer)以独占模式持有 mutex,并将 shared_data 的值加一。读取线程可以同时持有锁,而写入线程需要等待读取线程释放锁。
#include <cstdio> #include <thread> #include <mutex> #include <shared_mutex> std::shared_mutex mutex; int shared_data = 0; void reader() { std::shared_lock lock(mutex); printf("reader: shared data value is %d\n", shared_data); } void writer() { std::lock_guard lock(mutex); shared_data += 1; printf("writer: incremented shared data value to %d\n", shared_data); } int main() { std::jthread t1(reader); std::jthread t2(writer); std::jthread t3(reader); return 0; }