加载中...

| 类别 | 同步锁 |
| 读锁 | 可共享 |
| 写锁 | 需独占 |
| 适用负载 | 读多写少 |
读写锁是一种区分读操作和写操作的锁,它允许任意数量的线程同时持有读锁并发读取,但写锁必须独占,读写之间以及写写之间互斥。这样在读多写少的工作负载下,多个读者不必互相排队,大幅提高吞吐。
普通互斥锁不区分访问类型,即便都是只读也要串行,浪费了并行机会。读写锁基于一个观察:并发读取彼此不冲突,只有涉及写入时才需要独占。它维护读者计数和写者状态,按规则授予或阻塞请求,是数据库、缓存、文件系统等读密集系统常用的同步工具。
读写锁广泛用于保护读远多于写的共享数据,如内存缓存、路由表、配置信息和目录结构。Linux内核提供rwlock和顺序锁,POSIX线程库提供pthread_rwlock,数据库对表和索引的读写控制也体现了相同思想。
问:读写锁一定比互斥锁性能好吗?答:不一定。读写锁维护读者计数的开销更大,只有当读操作明显多于写且临界区较长时才划算;若写频繁或临界区极短,简单互斥锁反而更高效。
问:什么是写者饥饿?答:在读者优先策略下,只要不断有新读者进入,写者就一直等不到独占机会而长期阻塞。可通过写者优先或公平排队机制缓解。

| 类别 | 同步锁 |
| 读锁 | 可共享 |
| 写锁 | 需独占 |
| 适用负载 | 读多写少 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧