首页 > 其他分享 >go语言sync.Mutex

go语言sync.Mutex

时间:2023-04-18 12:22:39浏览次数:36  
标签:加锁 sync sema state race Mutex go

go语言sync.mutex

数据结构

type Mutex struct {
	state int32
	sema  uint32
}

Mutex包含了两个字段,分别是state、sema,state表示了当前锁的状态,sema是用于控制锁的一个信号量。这是一个零值可用的结构体,零值表示未加锁

state 字段的最低三位表示三种状态,分别是 mutexLocked mutexWoken mutexStarving ,剩下的用于统计当前在等待锁的 goroutine 数量

  • mutexLocked 表示是否处于锁定状态
  • mutexWoken 表示是否处于唤醒状态
  • mutexStarving 表示是否处于饥饿状态
  • waiterShift 表示等待的goroutine数量

Lock

func (m *Mutex) Lock() {
	// Fast path: grab unlocked mutex.
	if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
        // 用于辅助race检测器进行手动竞态检查
		if race.Enabled {
			race.Acquire(unsafe.Pointer(m))
		}
		return
	}
	// Slow path (outlined so that the fast path can be inlined)
	m.lockSlow()
}

Lock方法首先进行了一次cas操作,尝试将state的值从0改为1,代表首次进行加锁,如果成功直接返回,若是不成功,将调用lockSlow方法进行加锁。

标签:加锁,sync,sema,state,race,Mutex,go
From: https://www.cnblogs.com/zpf253/p/17329132.html

相关文章

  • cargo rustc
    RUSTC_BOOTSTRAP=1如果需要在稳定版编译器上执行一些夜间发布功能,可以设置该环境变量。$cargorustc---Zunpretty=expandedCompilingxxxv0.1.0(F:\xxx)error:theoption`Z`isonlyacceptedonthenightlycompiler$RUSTC_BOOTSTRAP=1cargorustc---Zunp......
  • golang打包和部署到centos
     项目在golang开发好,打包上传到linux服务器运行,两步:1、打包;在控制台项目于目录下,执行下列命令setGOOS=linuxsetGOARCH=amd64gobuild -o"packageName"如下图所示:会生成一个没有后缀的二进制文件main2、生成main文件上传到Linux服务器运行;上传操作在前面mysql配......
  • gozero的指令
    快速创建api服务在当前目录下会新建一个xxx目录goctlapinewxxx根据api文件生成api服务goctlapigo-apixxx.api-dir.根据API文件生成markdown文档#api文件需要配合@doc使用,比如#serviceuser-api{# @doc"用户登录"# @handlerlogin# post/user/login(Lo......
  • Python Django 模板的使用
    新建templates/header.html文件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>header</title></head><body><h1>东营职业学院</h1><p>......
  • Go笔记(八):指针
    1、指针在Go中,指针的操作有两个符号:&(取地址)和*(变量指针的声明|取指针变量的值)。一个指针变量指向了一个值的内存地址。Go中函数传值皆为值拷贝,对于引用类型的传值,可以创建一个指针变量,无需拷贝数据。Go中,类型指针不能进行偏移和运算。2、指针地址和指针......
  • Django中TruncMonth截取日期使用方法,按月统计
    将原来的年月日按照月份来截取统计数据,具体参考如下官方示例:-官方提供fromdjango.db.models.functionsimportTruncMonthArticle.objects.annotate(month=TruncMonth('timestamp'))#Truncatetomonthandaddtoselectlist.values('month')#GroupBymonth.anno......
  • JavaScript 利用 async await 实现 sleep 效果
    constsleep=(timeountMS)=>newPromise((resolve)=>{setTimeout(resolve,timeountMS);});(async()=>{console.log('11111111,'+newDate());awaitsleep(2000);console.log('22222222,'+newDate());await......
  • 论文解读《Automatically discovering and learning new visual categories with rank
    论文信息论文标题:Automaticallydiscoveringandlearningnewvisualcategorieswithrankingstatistics论文作者:K.Han, Sylvestre-AlviseRebuffi, SébastienEhrhardt, A.Vedaldi, AndrewZisserman论文来源:ICLR2020论文地址:download 论文代码:download视屏讲解:clic......
  • (微服务)服务治理:熔断器介绍以及hystrix-go的使用
    一、什么是熔断器要理解熔断器,可以先看看电路中使用的保险丝。保险丝(fuse)也被称为电流保险丝,IEC127标准将它定义为“熔断体(fuse-link)”。保险丝是一种保证电路安全运行的电子元器件,作用就是在电流异常升高到一定的高度和热度的时候,自身熔断切断电流,这样可以保护电路安全运行。......
  • vue加goframe使用AES加解密(记录)
    vue加goframe使用AES加解密首先,需要在前端使用Vue的crypto-js库来进行AES加解密,可以使用以下命令进行安装:npminstallcrypto-js然后在需要加解密的组件中引入该库:importCryptoJSfrom'crypto-js'对于加密,可以使用以下代码:constkey=CryptoJS.enc.Utf8.parse('1234567......