加载中...
读写锁是一种允许多个读者并发访问、但写者必须独占的同步机制:读读不互斥,读写与写写互斥。在读多写少的场景中,它比互斥锁有更高的并发度,是并发编程中的基础模式,但需注意写者饥饿与升级死锁问题。

| 英文名 | Read-Write Lock |
| 别名 | 共享-排他锁 |
| 互斥关系 | 读读共享、读写互斥 |
| 典型实现 | pthread_rwlock、RWMutex |
| 适用场景 | 读多写少 |
读写锁模式(Read-Write Lock,又称共享-排他锁)是一种并发同步模式:把对共享资源的访问分为读和写两类,允许任意多个读线程同时持有读锁,而写线程必须独占写锁;只要有写者存在,其他读写请求都被阻塞。
普通互斥锁不区分访问类型,即使多个线程都只是读取也要排队串行,浪费并发能力。读写锁基于一个事实:读操作不修改状态,彼此并发是安全的,冲突只发生在有写者参与时。POSIX 线程库的 pthread_rwlock、Java 的 ReentrantReadWriteLock 与 StampedLock、Go 的 sync.RWMutex、C++17 的 shared_mutex 都是标准实现。数据库中的共享锁与排他锁也是同一思想。
读写锁适合读远多于写的共享数据:配置中心的内存配置、路由表、缓存索引、黑白名单等,读取每秒成千上万次而更新每分钟寥寥数次,此时读写锁能显著优于互斥锁。若读写比例接近,读写锁维护自身状态的开销反而可能得不偿失。
问:什么是锁升级死锁?答:线程在持有读锁时直接申请写锁,而写锁要等所有读锁释放;若两个线程同时这样做,互相等待对方放弃读锁,就会死锁。多数实现因此禁止锁升级,需先释放读锁再竞争写锁。
问:读多写少时读写锁一定更快吗?答:不一定。读写锁内部要维护读者计数与等待队列,临界区极短时其开销可能超过收益,此时无锁结构、RCU 或简单互斥锁可能表现更好,应以压测为准。

| 英文名 | Read-Write Lock |
| 别名 | 共享-排他锁 |
| 互斥关系 | 读读共享、读写互斥 |
| 典型实现 | pthread_rwlock、RWMutex |
| 适用场景 | 读多写少 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧