当前位置:网站首页>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 .
边栏推荐
- js中#号的作用
- FileZilla client download and installation
- Makefile demo
- Role of JS No
- TCP, the heavyweight guest in tcp/ip model -- Kuige of Shangwen network
- Recursive use and multi-dimensional array object to one-dimensional array object
- Dynamic programming: longest common substring and longest common subsequence
- [Apple Push] IMessage group sending condition document (push certificate) development tool pushnotification
- golang xxx. Go code template
- Advanced redis applications [password protection, data persistence, master-slave synchronization, sentinel mode, transactions] [not completed yet (semi-finished products)]
猜你喜欢
CEPH Shangwen network xUP Nange that releases the power of data
Wechat applet + Alibaba IOT platform + Hezhou air724ug build a serverless IOT system (III) -- wechat applet is directly connected to Alibaba IOT platform aliiot
How to move towards IPv6: IPv6 Transition Technology - Shangwen network quigo
FileZilla Client下载安装
ffmpeg之 一张/多张图片合成视频
IPv6 transition technology-6to4 manual tunnel configuration experiment -- Kuige of Shangwen network
简易版 微信小程序开发之页面跳转、数据绑定、获取用户信息、获取用户位置信息
递归:快速排序,归并排序和堆排序
Recursion: depth first search
『期末复习』16/32位微处理器(8086)基本寄存器
随机推荐
Intercept string fixed length to array
QQ小程序开发之 一些前期准备:预约开发账号、下载安装开发者工具、创建qq小程序
TCP, the heavyweight guest in tcp/ip model -- Kuige of Shangwen network
Download and install captura and configure ffmpeg in captura
vim 的实用操作
Dynamic programming: Longest palindrome substring and subsequence
Introduction to mongodb
CEPH Shangwen network xUP Nange that releases the power of data
FileZilla client download and installation
Mysql Mac版下载安装教程
Makefile demo
[combinatorics] basic counting principle (addition principle | multiplication principle)
Error in compiled file: error: unmapped character encoding GBK
Mongodb master profile
leetcode:297. 二叉树的序列化与反序列化
Leetcode: dynamic planning template
[leetcode question brushing day 34] 540 Unique element in array, 384 Disrupt array, 202 Happy number, 149 Maximum number of points on a line
递归:深度优先搜索
105. SAP UI5 Master-Detail 布局模式的联动效果实现明细介绍
毕设-基于SSM宠物领养中心