当前位置:网站首页>Mutex and rwmutex in golang
Mutex and rwmutex in golang
2022-07-03 03:54:00 【sandyznb】
Mutex The mutex , The main means of access control for shared resources , It's easy to use , Just Lock and Unlock(), Simple use does not mean simple internal implementation , We can think deeply about if Mutex What happens when you unlock repeatedly ? Why does it show up ?
One :Mutex data structure
src\sync\mutex.go
// A Mutex must not be copied after first use.
type Mutex struct {
state int32
sema uint32
}
// A Locker represents an object that can be locked and unlocked.
type Locker interface {
Lock()
Unlock()
}state: Save the relevant data of the lock For example, the state of the lock 、 How many are waiting for this lock goroutine wait
sema: Semaphore , The coroutine block waits for the semaphore , The unlocked coroutine releases the semaphore to wake up the coroutine waiting for the semaphore .

locked: Indicates whether the current lock is locked ,0 It's not locked ,1 It's locked
woken: Is there a process that has been awakened ,0: There's no synergy 1: There is a process to wake up , In the process of locking
starving: Indicates whether the current lock is hungry ,0 No hunger ,1 Starvation It means that the blocking time of some processes has exceeded 1ms
waiter: The number of coprocesses blocking waiting locks , When unlocking the co process, judge whether to release the semaphore according to this value
Two : Add unlocking process
1 Simple locking : Suppose there is only one co process locking , No other co process interference ,locked From 0---->1, The locking process will judge locked Whether the flag bit is 0, If it is 0 Then put locked Set as 1, It represents the success of locking .
2 Locking is blocked : Suppose when locking , The lock has been occupied by other processes (locked It's already 1), here waiter The counter will be +1, The current process will be blocked , until locked become 0 Only then can we have a chance to be awakened
3 Simply unlock : Suppose there is no other co process blocking when unlocking ,locked from 1---->0, And there is no need to release semaphores
4 Unlock and wake up the process : Suppose when unlocking , Yes 1 One or more processes are blocked ,locked from 1--->0, here waiter>0, So release a semaphore , Wake up a blocked process , The awakened synergetic process Locked from 0--->1, The awakened process lives a lock
3、 ... and : The spin
When it's locked , If at present Locked It's already 1, It indicates that the lock has been occupied , The process of trying to lock does not immediately turn into blocking , It will continue to detect Locked Whether it becomes 0, This process is called spin process .
The spin time is very short , If you find that the lock has been released in the process of spinning , Then this process will immediately get all , At this time, even if other processes are awakened, the lock cannot be obtained , Can only block again .
The advantage of spin is that when locking fails, there is no need to immediately turn to blocking , There is a certain chance to get the lock , In this way, the switching of coordination process can be avoided .
The advantage of spin : Make better use of cpu, Try to avoid co process switching .
The problem with spin : If a lock is obtained during spin , Previously blocked processes will not get locks , If there are many locking processes and the lock is obtained by spinning every time , Then it is difficult for the blocked process to obtain the lock , Is in a state of hunger . This is the front starving, It doesn't spin in this state .
Four :Mutex Pattern
normal Patterns and starvation Pattern
The default state is normal, In this mode , If the process fails to lock, it will not immediately turn into the blocking queue , Instead, first judge whether the spin condition is satisfied , If satisfied, it will start the spin process and try to grab the lock .
边栏推荐
- QQ小程序开发之 一些前期准备:预约开发账号、下载安装开发者工具、创建qq小程序
- Recursion: one dimensional linked lists and arrays
- ffmpeg之 一张/多张图片合成视频
- The difference between static web pages and dynamic web pages & the difference between Web1.0 and Web2.0 & the difference between get and post
- golang xxx. Go code template
- Web session management security issues
- 简易版 微信小程序开发之页面跳转、数据绑定、获取用户信息、获取用户位置信息
- redis在服务器linux下的启动的相关命令(安装和配置)
- numpy之 警告VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences
- Numpy warning visibledeprecationwarning: creating an ndarray from ragged needed sequences
猜你喜欢

SAP ui5 application development tutorial 105 - detailed introduction to the linkage effect implementation of SAP ui5 master detail layout mode

在写web项目的时候,文件上传用到了smartupload,用了new string()进行转码,但是在数据库中,还是会出现类似扑克的乱码

Ffmpeg recording screen and screenshot

leetcode:动态规划模板

QQ小程序开发之 一些前期准备:预约开发账号、下载安装开发者工具、创建qq小程序

Message queue addition failure

Without sxid, suid & sgid will be in danger- Shangwen network xUP Nange

For instruction, uploading pictures and display effect optimization of simple wechat applet development

Téléchargement et installation du client Filezilla

Mysql Mac版下载安装教程
随机推荐
[Blue Bridge Road - bug free code] pcf8591 - code analysis of AD conversion
动态规划:最长公共子串和最长公共子序列
Arlo's thinking about himself
Ffmpeg recording screen and screenshot
QSAR model establishment script based on pytoch and rdkit
Bisher - based on SSM pet adoption center
基于Pytorch和RDKit的QSAR模型建立脚本
递归:一维链表和数组
105. Detailed introduction of linkage effect realization of SAP ui5 master detail layout mode
Makefile demo
Appium automated testing framework
TCP, the heavyweight guest in tcp/ip model -- Kuige of Shangwen network
Write it down once Net travel management background CPU Explosion Analysis
[mathematical logic] predicate logic (first-order predicate logic formula | example)
Commands related to the startup of redis under Linux server (installation and configuration)
Null and undefined
Pytorch multi card distributed training distributeddataparallel usage
【刷题篇】 找出第 K 小的数对距离
Open Visual Studio 2010 hangs when opening a SQL file sql file
Download and install node, NPM and yarn