当前位置:网站首页>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 .
边栏推荐
- 2.14 simulation summary
- [Yu Yue education] reference materials of political communication science of Communication University of China
- Mongodb master profile
- 2022-07-02:以下go语言代码输出什么?A:编译错误;B:Panic;C:NaN。 package main import “fmt“ func main() { var a =
- [Blue Bridge Road -- bug free code] DS18B20 temperature reading code analysis
- 105. SAP UI5 Master-Detail 布局模式的联动效果实现明细介绍
- Dynamic programming: Longest palindrome substring and subsequence
- MongoDB簡介
- pytorch项目怎么跑?
- 递归:深度优先搜索
猜你喜欢

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

Download and install node, NPM and yarn

numpy之 警告VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences

Table structure of Navicat export database

Hutool dynamically adds scheduled tasks

Introduction à mongodb

User value is the last word in the competition of mobile phone market

NPM: the 'NPM' item cannot be recognized as the name of a cmdlet, function, script file, or runnable program. Please check the spelling of the name. If the path is included, make sure the path is corr

【刷题篇】接雨水(一维)

ffmpeg下载安装教程及介绍
随机推荐
学会pytorch能干什么?
[Yu Yue education] reference materials of political communication science of Communication University of China
TCP/IP模型中的重磅嘉宾TCP--尚文网络奎哥
MySQL MAC download and installation tutorial
2022 tea master (intermediate) examination questions and analysis and tea master (intermediate) practical examination video
Commands related to the startup of redis under Linux server (installation and configuration)
[leetcode question brushing day 34] 540 Unique element in array, 384 Disrupt array, 202 Happy number, 149 Maximum number of points on a line
Download and install node, NPM and yarn
Read a paper_ ChineseBert
How to download pytorch? Where can I download pytorch?
Intercept string fixed length to array
Reflection and planning of a sophomore majoring in electronic information engineering
[DRM] simple analysis of DRM bridge driver call process
Introduction to mongodb
nodejs基础:浅聊url和querystring模块
Introduction à mongodb
TCP, the heavyweight guest in tcp/ip model -- Kuige of Shangwen network
Ffmpeg download and installation tutorial and introduction
Recursion: depth first search
Captura下载安装及在Captura配置FFmpeg