这篇文章主要介绍“Go并发之RWMutex源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go并发之RWMutex源码分析”文章能帮助大家解决问题。RWMutex
是一个支持并行读串行写的读写锁。RWMutex
具有写操作优先的特点,写操作发生时,仅允许正在执行的读操作执行,后续的读操作都会被阻塞。RWMutex
常用于大免费云主机域名量并发读,少量并发写的场景;比如微服务配置更新、交易路由缓存等场景。相对于Mutex
互斥锁,RWMutex
读写锁具有更好的读性能。下面以 “多个协程并行读取str变量,一个协程每100毫秒定时更新str变量” 场景为例,进行RWMutex
读写锁和Mutex
互斥锁的性能对比。RWMutex
读写锁和Mutex
互斥锁的性能对比,结果如下:# go test 结果
go test -bench . -benchtime=10s
BenchmarkRWMutex-8 227611413 49.5 ns/op
BenchmarkMutex-8 135363408 87.8 ns/op
PASS
ok demo 37.800sRWMutex
是一个写操作优先的读写锁,如下图所示:写操作C发生时,读操作A和读操作B正在执行,因此写操作C被挂起;当读操作D发生时,由于存在写操作C等待锁,所以读操作D被挂起;读操作A和读操作B执行完成,由于没有读操作和写操作正在执行,写操作C被唤醒执行;当读操作E发生时,由于写操作C正在执行,所以读操作E被挂起;当写操作C执行完成后,读操作D和读操作E被唤醒;RWMutex
由如下变量组成:rwmutexMaxReaders
:表示RWMutex
能接受的最大读协程数量,超过rwmutexMaxReaders
后会发生panic;w
:Mutex
互斥锁,用于实现写操作之间的互斥writerSem
:写操作操作信号量;当存在读操作时,写操作会被挂起;读操作全部完成后,通过writerSem
信号量唤醒写操作;readerSem
:读操作信号量;当存在写操作时,读操作会被挂起;写操作完成后,通过readerSem
信号量唤醒读操作;readerCount
:正在执行中的读操作数量;当不存在写操作时从0开始计数,为正数;当存在写操作时从负的rwmutexMaxReaders开始计数,为负数;readerWait
:写操作等待读操作的数量;当执行Lock()
方法时,如果当前存在读操作,会将读操作的数量记录在readerWait
中,并挂起写操作;读操作执行完成后,会更新readerWait
,当readerWait
为0时,唤醒写操作;Lock
方法用于写操作获取锁,其操作如下:获取w
互斥锁,保证同一时刻只有一个写操作执行;将readerCount
更新为负数,使后续发生的读操作被阻塞;如果当前存在活跃的读操作r != 0
,写操作进入阻塞状态runtime_SemacquireMutex
;Unlock
方法用于写操作释放锁,其操作如下:将readerCount
更新为正数,表示当前不存在活跃的写操作;如果更新后的readerCount
大于0,表示当前写操作阻塞了readerCount
个读操作,需要将所有被阻塞的读操作都唤醒;将w
互斥锁释放,允许其他写操作执行;RLock
方法用于读操作获取锁,其操作如下:原子更新readerCount+1
;如果当前存在写操作atomic.AddInt32(&rw.readerCount, 1) ,读操作进入阻塞状态;
RUnlock
方法用于读操作释放锁,其操作如下:原子更新readerCount-1
;如果当前读操作阻塞了写操作atomic.AddInt32(&rw.readerCount, -1),原子更新
当readerWait-1
;readerWait
为0时,表示阻塞写操作的所有读操作都执行完了,唤醒写操作;关于“Go并发之RWMutex源码分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。
这篇“小程序聊天室功能怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,免费云主机域名希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“小程序聊天室功能怎么实现”文章吧。首先在头部定义 ..…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。