linux各种锁机制的使用及区别(浅谈)
Golang语言社区 · · 1726 次点击 · · 开始浏览package main
import (
"sync"
"time"
. "github.com/soekchl/myUtils"
)
var mux sync.RWMutex
func tt() {
Notice()
mux.Lock() // 3
Notice()
defer mux.Unlock()
time.Sleep(time.Second * 5)
}
func main() {
go tt()
Notice()
mux.RLock() // 1
Notice()
defer mux.RUnlock()
time.Sleep(1 * time.Second)
Notice()
mux.RLock() // 2
Notice()
defer mux.RUnlock()
time.Sleep(5 * time.Second)
}
这块按照正常理论 没有问题,程序 有时运行也没有错误! 但是这样写不对的
如果 锁3 先运行 这问题就没有事儿
但是如果锁 1 先运行 然后 锁3 ,然后 锁2的话 就死锁了
锁1 运行的时候 申请所 成功
然后 锁3 排队申请锁
然后是 锁2
因为锁2 排在 锁3 后面 所以 锁1的 defer 锁还没能运行 锁3 一直申请不下来,锁2也 一直排队下去 然后就死锁了!
大家在用锁的时候 特别要小心,特别是跟 defer 一起用的时候
我的建议是吧 带锁的操作 放进 一个 小函数里 解决,不要再大一点的函数里 写 大量的 锁和defer 解锁。
每天坚持学习1小时Go语言,大家加油,我是彬哥,下期见!如果文章中不同观点、意见请文章下留言或者关注下方订阅号反馈!
社区交流群:221273219
Golang语言社区论坛 :
www.Golang.Ltd
LollipopGo游戏服务器地址:
https://github.com/Golangltd/LollipopGo
社区视频课程课件GIT地址:
https://github.com/Golangltd/codeclass
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
package main
import (
"sync"
"time"
. "github.com/soekchl/myUtils"
)
var mux sync.RWMutex
func tt() {
Notice()
mux.Lock() // 3
Notice()
defer mux.Unlock()
time.Sleep(time.Second * 5)
}
func main() {
go tt()
Notice()
mux.RLock() // 1
Notice()
defer mux.RUnlock()
time.Sleep(1 * time.Second)
Notice()
mux.RLock() // 2
Notice()
defer mux.RUnlock()
time.Sleep(5 * time.Second)
}
这块按照正常理论 没有问题,程序 有时运行也没有错误! 但是这样写不对的
如果 锁3 先运行 这问题就没有事儿
但是如果锁 1 先运行 然后 锁3 ,然后 锁2的话 就死锁了
锁1 运行的时候 申请所 成功
然后 锁3 排队申请锁
然后是 锁2
因为锁2 排在 锁3 后面 所以 锁1的 defer 锁还没能运行 锁3 一直申请不下来,锁2也 一直排队下去 然后就死锁了!
大家在用锁的时候 特别要小心,特别是跟 defer 一起用的时候
我的建议是吧 带锁的操作 放进 一个 小函数里 解决,不要再大一点的函数里 写 大量的 锁和defer 解锁。
每天坚持学习1小时Go语言,大家加油,我是彬哥,下期见!如果文章中不同观点、意见请文章下留言或者关注下方订阅号反馈!
社区交流群:221273219
Golang语言社区论坛 :
www.Golang.Ltd
LollipopGo游戏服务器地址:
https://github.com/Golangltd/LollipopGo
社区视频课程课件GIT地址:
https://github.com/Golangltd/codeclass