读写锁基础概念
读操作与写操作特性
在多线程编程环境中,读写锁(Read-Write Lock)是一种高效的同步机制,专门用于管理多个线程对共享资源的并发访问。
读操作特性:
- 无副作用操作
- 仅从共享资源获取信息
- 不改变资源状态
写操作特性:
并发访问的核心要求
在多线程同时访问共享资源时,必须确保以下特性:
- 一致性:所有线程看到的数据保持统一
- 原子性:复合操作要么全部完成,要么全部不发生
- 隔离性:线程间操作相互独立,互不干扰
- 持久性:写操作完成后结果必须持久保存
读写锁工作机制
锁类型划分
读写锁将对共享资源的访问分为两种类型:
读锁(共享锁):
- 允许多个线程同时读取资源
- 当没有写者时,读锁可被多个读者持有
- 有写者尝试获取锁时,新读请求会被阻塞
写锁(排他锁):
- 只允许单个线程写入资源
- 写锁具有排他性
- 持有写锁期间,其他所有线程都无法访问资源
访问规则总结
- 读-读:允许并发访问
- 读-写:互斥访问
- 写-读:互斥访问
- 写-写:互斥访问
C++标准库读写锁实现
C++17标准引入了std::shared_mutex,为开发者提供了标准的读写锁实现方案:
#include <shared_mutex>
#include <thread>
#include <iostream>
#include <vector>
#include <chrono>
class ThreadSafeCounter {
private:
mutable std::shared_mutex mutex_;
int value_ = 0;
public:
// 写操作 - 使用独占锁
void increment() {
std::unique_lock<std::shared_mutex> lock(mutex_);
value_++;
}
// 读操作 - 使用共享锁
int get() const {
std::shared_lock<std::shared_mutex> lock(mutex_);
return value_;
}
};
代码实现解析
在该示例中:
std::shared_lock 保护读操作,允许多个读者并发访问
std::unique_lock 保护写操作,确保写操作的独占性
- 读者线程可以同时访问共享数据
- 写者线程需要获得独占访问权限
关键问题解答
有线程在读时能否执行写操作?
答案:不能
当有线程正在读取数据时,写操作必须等待所有读操作完成后才能执行。这种机制确保了写操作不会破坏读者线程所看到的数据一致性视图。
有线程在写时能否执行读操作?
答案:不能
当有线程正在执行写操作时,所有其他线程(包括读者和写者)都必须等待写操作完成。这种设计保证了写操作的原子性和隔离性,避免了数据竞争和不一致问题。
标签: C++,std::shared_mutex,多线程编程,读写锁,并发控制,C++17
来自圈子: 面试专业户 |