《Go题库·16》读写锁底层是怎么实现的

itmrtan · · 1066 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

## **答案**(自由) 读写锁的底层是基于互斥锁实现的。 - 为什么有读写锁,它解决了什么问题?(使用场景) - 它的底层原理是什么? 在这里我会结合 Go 中的读写锁 RWMutex 进行介绍。 我们通过与 Mutex 对比得出答案。Mutex 是不区分 goroutine 对共享资源的操作行为的,在读操作、它会上锁,在写操作,它也会上锁,当一段时间内,读操作居多时,读操作在 Mutex 的保护下也不得不变为串行访问,对性能的影响也就比较大了。 RWMutex 读写锁的诞生为了区分读写操作,在进行读操作时,goroutine 就不必傻傻的等待了,而是可以并发地访问共享资源,将串行读变成了并行读,提高了读操作的性能。 读写锁针对解决一类问题:readers-writes ,同时有多个读或者多个写操作时,只要有一个线程在执行写操作,其他的线程都不能进行读操作。 读写锁其实有三种工作模型: - Read-perferring
优先读设计,可能会导致写饥饿 - Write-prferring
优先写设计,避免写饥饿 - 不指定优先级
不区分优先级,解决饥饿问题 Go 中的读写锁,工作模型是 Write-prferring 方案。 ## **答案**(栾龙生) 1. 读写锁解决问题 主要应用于写操作少,读操作多的场景。读写锁满足以下四条规则。 - 写锁需要阻塞写锁:一个协程拥有写锁时,其他协程写锁定需要阻塞; - 写锁需要阻塞读锁:一个协程拥有写锁时,其他协程读锁定需要阻塞; - 读锁需要阻塞写锁:一个协程拥有读锁时,其他协程写锁定需要阻塞; - 读锁不能阻塞读锁:一个协程拥有读锁时,其他协程也可以拥有读锁。 2. 读写锁底层实现 读写锁内部仍有一个互斥锁,用于将多个写操作隔离开来,其他几个都用于隔离读操作和写操作。 源码包`src/sync/rmmutex.go:RWMutex`中定义了读写锁的数据结构 ```go type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // semaphore for writers to wait for completing readers readerSem uint32 // semaphore for readers to wait for completing writers readerCount int32 // number of pending readers readerWait int32 // number of departing readers } ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1066 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传