找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

32

积分

0

好友

6

主题
发表于 2025-10-25 01:28:49 | 查看: 18| 回复: 0

读写锁基础概念

读操作与写操作特性

在多线程编程环境中,读写锁(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

来自圈子: 面试专业户
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-11-5 21:24 , Processed in 0.054544 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表