理解Go 语言中读写锁 RWMutex

        读写锁是计算机程序并发控制的一种针结互斥锁优化的同步机制,也称 “共享-互斥锁” 、多读单写锁等,用于处理大量读、少量写的场景。读操作之间可并发进行,写操作之间是互斥的,读和写又是互斥的。这意味着多个 goroutine 可以同时读数据,但写数据时需要获得一个独占的锁。读写锁的常见用法是控制 goroutine 对内存中某个共享变量的访问,这个共享变量不能被原子性更新,并且对此数据结构的访问大部分时间是读,只有少量的写。

1. 读写锁的使用场景

        互斥锁是 Go 语言中最常用的同步原语之一,而且使用起来非常简单,也经常用于控制对共享变量的访问,那为什么还要实现一个功能类似的读写锁呢?答案只有一个:为了性能。

我们使用一个互斥锁 Mutex 的例子做对比

func BenchmarkCounter_Mutex(b *testing.B) {// 1.声明一个 int64 类型的变量,做计数var counter int64// 2. 声明一个互斥锁var mu sync.Mutexfor i :=0; i < b.N; i++ {// 3. 并发执行b.RunParallel(func(pb *testing.PB) {i := 0// 4. 迭代测试for pb.Next(){i++// 5. 如果是10000的整数倍,则获取锁,计数值加 1if i%10000 == 0 {mu.Lock()counter++mu.Unlock()} else {// 6. 否则,只读取这个计数值mu.Lock()_= countermu.Unlock()}}})}
}

        这个测试使用了一个互斥锁,在读写比大概是 10000:1 的情况下对计数值进行读/写,所以是一个读多写少的场景。

        如果有多个 goroutine 读取 counter 的值,则必须互斥访问,同时只有一个 goroutine 可以读取 counter 的值,即使此时没有对 counter 的写入。

     

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

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

相关文章

mac电脑显示隐藏文件

方法一&#xff1a; 第一步&#xff1a;打开「终端」应用程序。 第二步&#xff1a;输入如下命令&#xff1a; defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder 第三步&#xff1a;按下「Return」键确认。 现在你将会在 Finder 窗口中…

AI+X活动开放报名!Datawhale来南京了

Datawhale线下 主办方&#xff1a;讯飞开放平台、Datawhale、GDG南京 AIX 主题活动今年将走进 10 个城市&#xff0c;100 所高校&#xff0c;目前已经走进32所高校&#xff0c;以及北京、深圳、上海、杭州、武汉五个城市&#xff0c;南京是第六个城市&#xff0c;时间7月27号。…

IP-Trunk简介

定义 IP-Trunk是将多个链路层协议为HDLC的POS接口捆绑到一起&#xff0c;形成一条逻辑上的数据链路&#xff0c;以提供更高的连接可靠性和更大的带宽&#xff0c;实现流量负载分担。 目的 POS是一种应用在城域网及广域网中的技术&#xff0c;利用SONET/SDH提供的高速传输通道…

html改写vue日志

本人最近学了vue&#xff0c;想着练手的方法就是改写之前在公司开发的小系统前端&#xff0c;将前端的AJAXJSThymeleaf改为axiosvue。 改写html 将<html>中的<head>和<body>结构移除&#xff0c;将css部分移入<style>&#xff0c; 重新定义了全局的&…

视频汇聚,GB28181,rtsp,rtmp,sip,webrtc,视频点播等多元异构视频融合,视频通话,视频会议交互方案

现在视频汇聚&#xff0c;视频融合和视频互动&#xff0c;是视频技术的应用方向&#xff0c;目前客户一般有很多视频的业务系统&#xff0c;如已有GB28181的监控&#xff08;GB现在是国内主流&#xff0c;大量开源接入和商用方案&#xff09;&#xff0c;rtsp设备&#xff0c;音…

x264、x265、libaom 编码对比实验

介绍 x264 是一个开源的高性能 H.264/MPEG-4 AVC 编码器,它以其优秀的压缩比和广泛的适用性而闻名。x265 是一种用于将视频流编码成 H.265/MPEG-H HEVC 压缩格式的免费软件库和应用程序,以其下一代压缩能力和卓越的质量而闻名 。作为 x264 的继任者,x265 支持 HEVC 的 Main、…

科研绘图系列:R语言单细胞聚类气泡图(single cell bubble)

介绍 单细胞的标记基因气泡图是一种用于展示单细胞数据中特定基因表达情况的可视化方法。它通常用于展示细胞亚群中标记基因的表达水平,帮助研究者识别和区分不同的细胞类型。在这种图表中,每个细胞亚群用不同的颜色表示,而基因表达水平则通过气泡的大小来表示,从而直观地…

前端算法入门【栈】

在JavaScript中是不存在栈这个数据结构的&#xff0c;但是我们可以通过数组来模拟栈。 1、基本实现 栈是一种“后进先后”的数据结构&#xff0c;数据在内存中是连续存储的&#xff0c;可以通过数组的 push 来模拟茹栈&#xff0c;pop 来模拟入栈。 // 栈 后进先出 const stac…

Android笔试面试题AI答之Intent(1)

答案仅供参考&#xff0c;来自文心一言 目录 1.请描述一下Intent 和 Intent Filter。IntentIntent Filter总结 2.Intent可以传递哪些类型数据&#xff1f;3.Serializable 和 Parcelable 的区别1. 效率2. 使用方式3. 适用场景4. 其他差异 4.请写出直接拨号、将电话号码传入拨号…

【IEEE出版,会议历史良好、论文录用检索快】第四届计算机科学与区块链国际学术会议 (CCSB 2024,9月6-8)

CCSB 2024会议由深圳大学主办&#xff0c;旨在探讨计算机科学的最新发展如何与区块链技术相结合&#xff0c;以及这一结合如何推动金融、供应链管理、数据安全和其他多个行业的革新&#xff0c; 本次会议将提供一个多学科交流的平台&#xff0c;汇集来自相关领域学者的研究和思…

最优化理论与方法-第十讲-对偶理论的基本性质和割平面法

文章目录 1. 向量化拉格朗日对偶函数2. 对偶问题是凹函数3. 对偶问题转换4. 外逼近法4.1 步骤4.2 注意事项 1. 向量化拉格朗日对偶函数 ( D ) max ⁡ d ( λ , μ ) s t . λ i ≥ 0 , i 1 , ⋯ , m , d ( λ , μ ) min ⁡ x ∈ X { f ( x ) ∑ i 1 m λ i g i ( x ) ∑ …

【AI那些事】YOLO算法在香橙派AIpro上跑起来的初体验

一、本文概述 在之前推出的Yolo算法后&#xff0c;我在windows电脑上使用python语言运行将其跑通了&#xff0c;觉的这个识别算法很是有意思&#xff0c;就一直想着这个算法能不能跑在硬件的开发板上那就太好了。我就开始寻找市面上可行的开发板&#xff0c;一直期盼的事情真的…

【学术研究、研究热点、最新前沿】如何跟踪最新的论文

1.跟踪arxiv 使用https://www.arxivdaily.com/接收每天的推送。 2.跟踪热点文章的引用 使用semantic scholar。 3.跟踪某个学术大佬或者主题 3.1 使用web of science。 3.2 使用文献鸟 4.跟踪某个期刊

迭代学习笔记

一、迭代学习定义和分类 1、直观理解 迭代学习一般应用于重复性的场景。比如控制一个单自由度的小车以特定的速度曲线移动到指定位置&#xff0c;整个时间是10s&#xff0c;控制频率是0.01&#xff0c;那么整个控制序列就会有1000个点。这1000个点在10s内依次发出&#xff0c…

小白快速入门量化交易的自学路径

今年已然过去一半了&#xff0c;年初立的flag都实现了吗&#xff1f; 据我多年来的观察&#xff0c;很多小白萌新开始学习量化&#xff0c;特别是年初的时候立下“宏图大志”&#xff0c;但有相当一部分最终没能"上岸"&#xff0c;从入门到放弃&#xff0c;从然后到没…

数据结构2—顺序表(附源码)

1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就是说连续的一条直线…

抽象java入门1.5.2

前言&#xff1a; 坑留下来是为了补的 正片&#xff1a; 一、面向对象特性 二、面向对象编程详细展开 这些没有加粗的方法究竟来源哪&#xff1f; 在上一期的提示中&#xff0c;我们说了这些方法来源于面向对象编程的一个特性 验证&#xff1a; 第一步&#xff1a;我们先…

区块链空投之空投合约

关于 solidity、空投、智能合约 空投作为区块链行业最大的惊喜之一,很多人都是通过空投才接触到了这一领域。 甚至有很多专业薅空投羊毛的专业玩家。行业内有句话,小薅养活妻儿、大薅… 文章目录 前言空投到底是什么空投什么?空投合约代码空投步骤代码解析代码详解前言 今…

代码随想录算法训练营第23天|39. 组合总和、40.组合总和II、131.分割回文串

打卡Day23 1.39. 组合总和2.40.组合总和II3.131.分割回文串 1.39. 组合总和 题目链接&#xff1a;39. 组合总和 文档讲解&#xff1a; 代码随想录 这道题和昨天做的组合之和由两个区别&#xff1a;被选的元素没有数量限制&#xff0c;同时被选的元素可以无限重复&#xff0c;…

【嵌入式开发之标准I/O】流的刷新、定位以及格式化输出、输入

流的刷新 int fflush(FILE *fp); 成功时返回0&#xff1b;出错时返回EOF。 将流缓冲区中的数据写入实际的文件。 Linux下只能刷新输出缓冲区,输入缓冲区丢弃。 如果输出到屏幕使用fflush(stdout)。 流的定位 流的定位&#xff1a;ftell()函数 long ftell(FILE *stream)…