linux各种锁机制的使用及区别(浅谈)

栏目: Go · 发布时间: 5年前

内容简介:这块按照正常理论 没有问题,程序 有时运行也没有错误! 但是这样写不对的如果 锁3 先运行 这问题就没有事儿

linux各种锁机制的使用及区别(浅谈)

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
linux各种锁机制的使用及区别(浅谈)

Golang语言社区


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的数学2

程序员的数学2

平冈和幸、堀玄 / 陈筱烟 / 人民邮电出版社 / 2015-8-1 / CNY 79.00

本书沿袭《程序员的数学》平易近人的风格,用通俗的语言和具体的图表深入讲解程序员必须掌握的各类概率统计知识,例证丰富,讲解明晰,且提供了大量扩展内容,引导读者进一步深入学习。 本书涉及随机变量、贝叶斯公式、离散值和连续值的概率分布、协方差矩阵、多元正态分布、估计与检验理论、伪随机数以及概率论的各类应用,适合程序设计人员与数学爱好者阅读,也可作为高中或大学非数学专业学生的概率论入门读物。一起来看看 《程序员的数学2》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换