各类资料学习下载合集
链接:https://pan.quark.cn/s/770d9387db5f
在之前的学习中,我们掌握了互斥锁(Mutex)。互斥锁虽然安全,但比较“霸道”:无论你是想看一眼数据,还是想修改数据,它都只允许一个人进门。
试想一下淘宝的“我的”页面:
- 查看用户信息(读操作):每天可能有上亿次请求。
- 修改用户信息(写操作):用户偶尔才会改个昵称或换个头像。
如果用互斥锁,哪怕一亿个人只是想同时看看自己的昵称,也得排队一个接一个来,这效率显然无法接受。这时候,读写锁(Read-Write Lock)就派上用场了。
一、 读写锁:专为“读多写少”而生
1. 核心应用场景
读写锁最适合“读操作次数远大于写操作次数”的场景(建议比例 > 10:1)。
- 典型例子:数据库查询、配置文件的读取、网站的静态内容展示。
- 对比互斥锁:
- 全写场景:如果所有线程都是写操作,读写锁与互斥锁性能相当(因为写都是独占的)。
- 读多写少:读写锁允许所有读线程并发执行,性能远超互斥锁。
2. 操作函数详解
在使用读写锁之前,我们需要了解它的 API,特别是其中一个特殊的关键字。
(1) 初始化与销毁
intpthread_rwlock_init(pthread_rwlock_t*restrict rwlock,constpthread_rwlockattr_t*restrict attr);intpthread_rwlock_destroy(pthread_rwlock_t*rwlock);- 参数:
rwlock:读写锁对象的指针。attr:属性,通常传NULL使用默认值。
🔍 硬核知识点:
restrict关键字
在函数原型中,你可能会注意到restrict这个修饰符(C99 标准引入)。
- 含义:它告诉编译器,“请放心,这个指针是访问它所指向内存的唯一方式”。
- 作用:防止指针别名(Aliasing),允许编译器进行更激进的优化(比如把变量缓存到寄存器中),提高代码执行效率。虽然对我们写代码逻辑影响不大,但了解它能让你看懂更底层的源码。
(2) 加锁与解锁
// 读模式加锁 (共享)intpthread_rwlock_rdlock(pthread_rwlock_t*rwlock);// 写模式加锁 (独占)intpthread_rwlock_wrlock(pthread_rwlock_t*rwlock);// 尝试加写锁 (非阻塞)intpthread_rwlock_trywrlock(pthread_rwlock_t*rwlock)