Go语言中的互斥锁(Mutex)和读写锁(RWMutex)

 Mutex

  Mutex结构体

type Mutex struct {state int32 //表示互斥锁的状态,比如是否被锁定等sema uint32 //表示信号里,协程阻塞等待的信号量,解锁的协程释放信号量从而唤醒等待信号量的协程
}

  • Locked: 表示Mutex是否已被锁定(1表示已经被锁定)
  • Woken: 表示是否有协程被唤醒(1已有协程唤醒,正在加锁过程中)
  • Starving: 表示Mutex是否处于饥饿状态(1表示饥饿状态,说明有协程阻塞超过1ms)
  • Waiter: 表示阻塞等待锁的协程个数,协程解锁时根据此值来判断是否需要释放洗好了.

协程之间抢锁实际上是抢给Locked赋值的权利,能给Locked值置为1,就说明抢锁成功.抢不到的话就阻塞等待Mutex.sema信号量,一旦持有锁的协程解锁,等到的协程就会被依次唤醒.

Mutex只有两个方法:

  • Lock()加锁
  • Unlock()解锁

加锁被阻塞以及解锁唤醒协程

自旋(CPU的"PAUSE"指令,CPU空转,什么也不做)

加锁时,如果当前Locked为1,说明该锁由其他协程持有,尝试加锁的协程并不是马上转入阻塞,而是会持续的探测Locked位是否变为0,这个过程即为自旋过程.自旋时间很短,但如果自旋过程中发现锁已经被释放,那么协程可以立即获取锁.(可以避免协程间的切片)

Mutex模式

 normal模式

默认情况下,Mutex的模式位normal,该模式下,协程如果加锁不成功不会立即转入阻塞排队,而是判断是否满足自旋条件,如果满足则会启动自旋过程,抢锁.

 starvation模式

自旋过程中能抢到锁的话,说明此时一定有协程释放了锁,释放锁时如果发现有阻塞等待的协程,还会释放一个信号量来唤醒一个等待协程,被唤醒的协程获得CPU开始运行,此时发现锁被抢占,自己再次阻塞,但是如果阻塞时间已经超过1ms,starving将被标记为1(饥饿模式)

饥饿模式下,不会启动自旋过程.

Woken状态

Woken状态用于加锁和解锁过程的通信.

读写锁

type RWMutex struct {w           Mutex  //用于控制多个写锁,获得写锁首先要获取该锁,如果有一个写锁在进行,那么再到来的写锁将会阻塞于此writerSem   uint32 //写阻塞等待的信号量,最后一个读者释放锁时会释放信号量readerSem   uint32 //读阻塞的协程等待的信号量,持有写锁的协程释放锁后会释放信号量readerCount int32  //记录读者个数readerWait  int32  //记录写阻塞时读者个数
}
接口定义
  • RLock(): 读锁定,等待写操作结束(如果有)
  • RUnlock(): 解除读锁定,唤醒等待写操作的协程(如果有)
  • Lock(): 写锁定,与Mutex完全一致,阻塞等待所有读操作结束(如果有)
  • Unlock(): 解除写锁定,与Mutex一致,唤醒因读锁定而被阻塞的协程(如果有)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Words(保留两位小数的输出方法,printf(“%.2f“,变量名))

题目:   每个句子有多个单词组成,句子中的每个单词的长度都可能不一样,我们假设每个单词的长度Ni为该单词的重量,你需要做的就是给出整个句子的平均重量。 保留两位小数的输出方法: System.out.printf("%.2f&…

电商网站流量特点和压力测试

一、电商网站介绍 电商网站,全称电子商务网站,是一种通过互联网进行商品和服务交易的商业活动。这些网站提供了一个平台,使得买卖双方可以进行远程交易,无需面对面。它们通常包括以下几个主要功能: 商品展示&#xff…

Go导入私有仓库

使用go.mod依赖第三方库时,有以下要求: 代码仓库托管于VCS(版本控制系统);代码仓库是公开的;仓库地址使用域名访问;仓库域名支持HTTPS访问。 对于自己或者公司内部搭建的私有git,这些条件是比较难同时满足…

K8S node节点配置

1.开始操作之前要先关闭防火墙,SELinux,swap分区 关闭防火墙 sudo systemctl stop firewalld关闭SELinux sudo setenforce 0 # 临时关闭 sudo sed -i s/^SELINUXenforcing$/SELINUXper…

常用脚本01 - 生成证书

1 生成证书 第一步、准备脚本文件 [rootharbor-01 ssl]# vim gencert.sh #!/usr/bin/env bash set -eDOMAIN"$1" IP"$2" WORK_DIR"$(mktemp -d)"if [ -z "$DOMAIN" ]; thenecho "Domain name needed."exit 1 fiecho "…

UML2.0在系统设计中的实际使用情况

目前我在系统分析设计过程中主要使用UML2.0来表达,使用StarUML软件做实际设计,操作起来基本很顺手,下面整理一下自己的使用情况。 1. UML2.0之十三张图 UML2.0一共13张图,可以分为两大类:结构图-静态图,行…

Centos7.9 OpenSSH 安全漏洞(CVE-2023-38408)

因为CVE-2023-38408,需要升级升级OpenSSH版本: yum groupinstall -y "Development Tools" yum install -y zlib-devel openssl-devel wgetcp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak chmod 600 /etc/ssh/ssh_host_rsa_key chmod 600…

Vitalik Buterin香港主旨演讲:协议过去10年迅速发展,但存在效率、安全两大问题

2024 香港 Web3 嘉年华期间,以太坊联合创始人 Vitalik Buterin 在由DRK Lab主办的“Web3 学者峰会 2024”上发表主旨演讲《Reaching the Limits of Protocol Design》。 他介绍到,2010年代,基于基本密码学的协议是哈希、签名。随后&#xff…

【vscode】快捷键及配置

不显示横向滑轨(一行太长直接在编辑界面换行显示,实际在代码文件上没有实际换行) ALT z

Android音视频开发-AudioRecord

Android音视频开发-AudioRecord 本篇文章主要讲下AudioRecord. 1: 简介 AudioRecord是Android平台上的一个类,用于实时录制音频数据。它提供了一种方便的方式来捕获和处理音频流。 以下是关于AudioRecord的一些介绍: 音频源:Record可以从…

Linux虚拟内存简介

Linux,像多数现代内核一样,采用了虚拟内存管理技术。该技术利用了大多数程序的一个典型特征,即访问局部性(locality of reference),以求高效使用CPU和RAM(物理内存)资源。大多数程序…

网络安全---非对称数据加密签名验证

一、课题描述 三位同学一组完成数据的非对称加密和数字签名验证传输。 三位同学分别扮演图中 Alice、Bob 和 CA 三个角色,Bob 和 Alice 从 CA 中获得数字证书、Bob 向 Alice 发送秘密发送一段加密并签名后的信息,Alice 获取 Bob 发送的加密信息&#x…

网络安全---Packet Tracer - 配置扩展 ACL

一、实验目的 在Windows环境下利用Cisco Packet Tracer进行 配置防火墙操作。 二、实验环境 1.Windows10、Cisco Packet Tracer 8.2 2.相关的环境设置 在最初的时候,我们已经得到了搭建好的拓扑模型,利用已经搭建好的拓扑模型,进行后续的…

[蓝桥杯 2019 国 B] 解谜游戏

[蓝桥杯 2019 国 B] 解谜游戏 题目背景 题目描述 小明正在玩一款解谜游戏。谜题由 24 24 24 根塑料棒组成,其中黄色塑料棒 4 4 4 根,红色 8 8 8 根,绿色 12 12 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。初始时这些塑料棒排…

华科大发布多模态大模型Monkey:低成本扩大输入分辨率,部分性能超越GPT-4V

前言 近年来,基于Transformer架构的多模态大语言模型(MLLM)在视觉理解和多模态推理任务中展现了出色的潜力。但这些模型通常需要大量的训练资源,限制了它们在更广泛研究和应用领域的普及。一种直接的解决方案是使用更小规模的预训练视觉和语言模型&…

Harmony鸿蒙南向驱动开发-MIPI CSI

CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。 物理层支持HS(High Speed&…

【御控物联】 2、物联网构成

文章目录 一、前言二、物联网的架构三、物联网的参与角色四、物联网的软硬件五、技术资料 一、前言 物联网的定义,前一章节我们已经做了大体介绍。本章我们说一下物联网的构成,物联网的构成相对来说比较难以总结,主要是因其应用场景特别的多…

UVA12538 Version Controlled IDE 题解 crope

Version Controlled IDE 传送门 题面翻译 维护一种数据结构,资磁三种操作。 1.在p位置插入一个字符串s 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 1 ≤ n ≤ 50000 1 \leq n \leq 50000 1≤n≤50000,所…

【案例分享】如何通过甘特图管理项目进度?

我将通过一个实际案例来具体说明我是如何通过甘特图来管理项目进度的。 案例背景: 我负责过一个软件开发项目:一款在线学习APP。项目团队包括项目经理、开发人员、测试人员、UI设计师等多个角色,预计项目周期为6个月。 案例实施过程&…

使用阿里云试用Elasticsearch学习:4. 聚合——1

在这之前,本书致力于搜索。 通过搜索,如果我们有一个查询并且希望找到匹配这个查询的文档集,就好比在大海捞针。 通过聚合,我们会得到一个数据的概览。我们需要的是分析和总结全套的数据而不是寻找单个文档: 在大海里…