golang中的(data race )典型数据竞争问题举例

2023-05-16

示例一

func main() {
	var wg sync.WaitGroup
	wg.Add(5)
	for i := 0; i < 5; i++ {
		go func() {
			fmt.Println(i) // Not the 'i' you are looking for.
			wg.Done()
		}()
	}
	wg.Wait()
}

显然,上述代码中 循环内的i被多个goroutine同时读取,代码执行结果有可能是44455或55555而不是 01234

改进办法

func main() {
	var wg sync.WaitGroup
	wg.Add(5)
	for i := 0; i < 5; i++ {
		go func(j int) {
			fmt.Println(j) // Good. Read local copy of the loop counter.
			wg.Done()
		}(i)
	}
	wg.Wait()
}

示例二

随意共享变量

// ParallelWrite writes data to file1 and file2, returns the errors.
func ParallelWrite(data []byte) chan error {
	res := make(chan error, 2)
	f1, err := os.Create("file1")
	if err != nil {
		res <- err
	} else {
		go func() {
			// This err is shared with the main goroutine,
			// so the write races with the write below.
			_, err = f1.Write(data)
			res <- err
			f1.Close()
		}()
	}
	f2, err := os.Create("file2") // The second conflicting write to err.
	if err != nil {
		res <- err
	} else {
		go func() {
			_, err = f2.Write(data)
			res <- err
			f2.Close()
		}()
	}
	return res
}

上述代码:goroutine内共享了外部作用域的变量,导致数据读取出错

改进方案(注意 := 的使用)

...
_, err := f1.Write(data)
...
_, err := f2.Write(data)
...

示例三

未保护的全局变量,map的并发读取

var service map[string]net.Addr

func RegisterService(name string, addr net.Addr) {
	service[name] = addr
}

func LookupService(name string) net.Addr {
	return service[name]
}

上述代码中的方法,如使用goroutine 调用则会发生数据争用,改进方案

var (
	service   map[string]net.Addr
	serviceMu sync.Mutex
)

func RegisterService(name string, addr net.Addr) {
	serviceMu.Lock()
	defer serviceMu.Unlock()
	service[name] = addr
}

func LookupService(name string) net.Addr {
	serviceMu.Lock()
	defer serviceMu.Unlock()
	return service[name]
}

示例四

原生数据变量的保护

type Watchdog struct{ last int64 }

func (w *Watchdog) KeepAlive() {
	w.last = time.Now().UnixNano() // First conflicting access.
}

func (w *Watchdog) Start() {
	go func() {
		for {
			time.Sleep(time.Second)
			// Second conflicting access.
			if w.last < time.Now().Add(-10*time.Second).UnixNano() {
				fmt.Println("No keepalives for 10 seconds. Dying.")
				os.Exit(1)
			}
		}
	}()
}

上述 的 Watchdog 结构体中变量的读取与修改会产生数据竞争,改进方案如下(使用sync/atomic 包)

type Watchdog struct{ last int64 }

func (w *Watchdog) KeepAlive() {
	atomic.StoreInt64(&w.last, time.Now().UnixNano())
}

func (w *Watchdog) Start() {
	go func() {
		for {
			time.Sleep(time.Second)
			if atomic.LoadInt64(&w.last) < time.Now().Add(-10*time.Second).UnixNano() {
				fmt.Println("No keepalives for 10 seconds. Dying.")
				os.Exit(1)
			}
		}
	}()
}

示例五 

c := make(chan struct{}) // or buffered channel

// The race detector cannot derive the happens before relation
// for the following send and close operations. These two operations
// are unsynchronized and happen concurrently.
go func() { c <- struct{}{} }()
close(c)

如上,主程与goroutine未同步,主程结束后goroutine也被销毁,改进方案:

c := make(chan struct{}) // or buffered channel

go func() { c <- struct{}{} }()
<-c
close(c)

平时写代码,有时发生了(data race)数据竞争却不容易发现,那么我们在构建的时候可以加上 -race 参数来检查我们的代码中是否出现数据竞争,使用示例如下

go test -race mypkg    // to test the package
go run -race mysrc.go  // to run the source file
go build -race mycmd   // to build the command
go install -race mypkg // to install the package

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang中的(data race )典型数据竞争问题举例 的相关文章

  • 如何让自己的网站快速被百度收录(方法一)

    首先让大家了解一下利用百度站长平台来让百度收录 需要在百度站长平台提交自己的网址 下面这个快速收录 xff0c 2020年7月份之前仅仅对部分优质站点开放 xff0c 之后基本上是不开放的 xff0c 所以我们选择普通收录 普通收录普通收录
  • CSS Backgrounds(背景)i火吧css

    CSS 背景 CSS 背景属性用于定义HTML元素的背景 CSS 属性定义背景效果 background color background image background repeat background attachment back
  • HTML 头部

    HTML 查看在线实例 定义了HTML文档的标题 使用 lt title gt 标签定义HTML文档的标题 定义了所有链接的URL 使用 定义页面中所有链接默认的链接目标地址 提供了HTML文档的meta标记 使用 元素来描述HTML文档的
  • win10自带看图工具找不到了怎么办?

    最近有很多朋友遇到win10自带看图工具找不到了 xff0c 怎么办 xff1f 有的朋友发现win10自带的看图软件没了 xff0c 有的人会去网上下载看图工具 xff0c 其实我们并不需要 xff0c 系统自带的看图工具我们是有办法调取
  • MySQL8.0设置远程访问权限,Navicat连接mysql

    今天centos7安装了mysql8 0过后远程登录数据库报错 1 首先查看防火墙状态 防火墙版本的不同命令也会有不同 0 4的命令为 systemctl status firewall service 0 5的命令为 systemctl
  • 能量景观(Energy landscape)

    文章目录 1 简介2 应用3 正式定义3 1 宏观例子 1 简介 图 世界社会经济系统的简化能量景观 xff0c 和不同细节层次的社会倾斜的动态 xff08 social tipping dynamics xff09 xff0c 突出影响转
  • 北大本科小妹妹:在北大“卷”了三年,才明白的四个道理…

    文章目录 1 比较是吃掉快乐的怪物2 什么都想要 xff0c 可能什么都得不到3 不要用精神战胜肉体4 和部分人资源共享最高效 1 比较是吃掉快乐的怪物 大一上学期的时候 xff0c 我上了一门课叫计算概论 xff0c 是教 C 语言的 x
  • 概率质量函数(Probability mass function)

    在概率和统计中 xff0c 概率质量函数 xff08 Probability mass function xff09 是给出离散随机变量恰好等于某个值的概率的函数 有时也称为离散密度函数 xff08 discrete density fun
  • 算法题 堆优化版本Dijkstra(Python)

    题目 xff1a 给定一个n个点m条边的有向图 xff0c 图中可能存在重边和自环 xff0c 所有边权均为非负值 请你求出1号点到n号点的最短距离 xff0c 如果无法从1号点走到n号点 xff0c 则输出 1 输入格式 第一行包含整数n
  • 自由概率(Free probability)

    文章目录 1 自由概率2 历史3 Wigner semicircle distribution3 1 一般性质3 2 与自由概率的关系 4 存在的问题 1 自由概率 自由概率是研究非交换随机变量 xff08 non commutative
  • 哥本哈根诠释(Copenhagen Interpretation)

    文章目录 1 背景2 经典物理学3 对应规则 xff08 The Correspondence Rule xff09 4 互补性 xff08 Complementarity xff09 5 经典概念的运用6 量子形式主义 xff08 the
  • 自振荡(Self-oscillation)

    文章目录 1 历史2 数学基础3 工程实例3 1 铁路和汽车车轮3 2 中央供暖恒温器3 3 自动变速箱3 4 路线修正延迟时的车辆转向3 5 SEIG xff08 自激感应发电机 xff09 3 6 自激变送器3 7 生物学中的种群周期
  • 分形(Fractal)及分形维数(Fractal dimension)

    文章目录 1 分形介绍2 分形的定义3 分形维数介绍4 历史5 缩放的作用 xff08 Role of scaling xff09 6 D 不是唯一描述符7 分形表面结构8 例子8 8 Hausdorff dimension8 8 1 直观
  • 自指(Self-reference)

    文章目录 1 在逻辑 数学和计算方面2 在生物学中3 在艺术4 在语言中5 在流行文化中6 在法律中 自我参照 xff08 Self reference xff09 是一个涉及指代自己或自己的属性 特征或行为的概念 它可以发生在语言 逻辑
  • 自组织(Self-organization),自组织临界性(Self-organized criticality)

    文章目录 1 自组织1 1 概述1 2 原则1 3 历史1 4 按领域1 4 1 物理1 4 2 化学1 4 3 生物学1 4 4 宇宙学1 4 5 计算机科学1 4 6 控制论1 4 7 社会学1 4 8 经济学1 4 9 运输1 4 1
  • 希尔伯特第 13 问题,Kolmogorov–Arnold representation theorem 和通用近似定理(Universal approximation theorem)

    文章目录 1 希尔伯特第十三问题1 1 介绍1 2 历史1 2 1 近期发展1 2 1 1 打开和关闭 xff0c 然后再打开1 2 1 2 事情的根源1 2 1 3 视觉思考1 2 1 4 迈向连接网络 1 3 列线图 xff08 Nom
  • 生存函数(Survival function)

    文章目录 1 定义2 生存函数的例子3 参数生存函数3 1 指数生存函数 xff08 Exponential survival function xff09 3 2 威布尔生存函数 xff08 Weibull survival functi
  • 不可分解分布(Indecomposable distribution)与无限可分性(infinite divisibility)

    文章目录 1 不可分解分布 xff08 Indecomposable distribution xff09 1 1 定义1 2 例子1 2 1 不可分解 xff08 Indecomposable xff09 1 2 2 可分解 1 3 相关
  • Integration using Feynman technique

    求解积分 xff1a 43
  • Python实现截图AI文字识字小工具

    1 获取百度识字API 由于百度提供了免费的图片识字API xff0c 而且非常好用 xff0c 所以直接使用百度的api来进行识字 首先在百度AI开放平台注册一个账号 xff0c 网址http ai baidu com xff0c 注册完

随机推荐

  • 用Python绘制皮卡丘

    来源 xff1a 动态图片基地 科普 xff1a 皮卡丘是日本任天堂公司开发的掌机游戏系列 口袋妖怪 中登场精灵中的一种 xff0c 为口袋妖怪里代表性的角色 随着其周边动画宠物小精灵 xff08 即神奇宝贝 xff09 动画的热播 xff
  • 用Python绘制词云图——表白为我们拼过命的白衣天使

    每天都听说医生和冠状病毒抗战的感人事迹 xff0c 有那么多的医生因为保护我们 xff0c 献出了自己的生命 希望逝者安息 xff0c 活者坚强 xff0c 所有健在的医生和我国同胞万众一心 xff0c 早日战胜病毒 静待春暖花开 xff0
  • Python画好看的星空图

    来源 xff1a 百度动图 关于星空 xff0c 有很多唯美的句子 一切都如生命一般 xff0c 在悄然地发生着变化 xff0c 就如这黑夜一样 xff0c 失去了光明 xff0c 却得到了星空的美 他在伦敦星空写下 xff1a 你是我唯一
  • Python画好看的星空图(唯美的背景)

    来源 xff1a 百度动图 关于星空 xff0c 有很多唯美的句子 一切都如生命一般 xff0c 在悄然地发生着变化 xff0c 就如这黑夜一样 xff0c 失去了光明 xff0c 却得到了星空的美 他在伦敦星空写下 xff1a 你是我唯一
  • Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)

    来源 xff1a 百度动图 我发现网上有很多写得很好的Python表白代码 xff0c 感觉绘出来的图很漂亮 我整理了一下 xff0c 挑了一些我觉得不错的代码和部分自认不错的原创分享给大家 xff08 这些我都测试过 xff0c 确实可以
  • 用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系

    我第一次建立关联图谱用的是R语言 xff0c 通过写代码帮公安挖掘团伙犯罪 xff0c 并用图形展示团伙之间的关联关系 如有需要请关注 阿黎逸阳的代码 公众号的后续文章 xff0c 会手把手教大家用R搭建关联图谱 xff0c 做成app x
  • 模型效果评价—混淆矩阵(原理及Python实现)

    对于分类模型 xff0c 在建立好模型后 xff0c 我们想对模型进行评价 xff0c 常见的指标有混淆矩阵 KS曲线 ROC曲线 AUC面积等 也可以自己定义函数 xff0c 把模型结果分割成n 100 份 xff0c 计算top1的准确
  • Python人脸识别—我的眼里只有你

    人脸识别总感觉特别高深 xff0c 但是因为Python中已经有很多前辈写好了一些库 xff0c 可以直接调用 xff0c 大大降低了人脸识别的难度 之前在网上看到陈晓眼里只有陈妍希的照片 xff0c 特别喜欢 xff0c 想自己用pyth
  • 最全Python绘制饼形图(饼状图)

    饼状图 xff08 pie chart xff09 一般用于描述分类型数据的相对频数或百分数频数分布 xff0c 呈现部分与总体的关系 一 导入绘图数据 首先导入绘图所需的数据 span class token keyword import
  • 最全Python绘制条形图(柱状图)

    条形图 xff08 bar chart xff09 也称为柱状图 xff0c 是一种以长方形的长度为变量的统计图表 xff0c 长方形的长度与它所对应的数值呈一定比例 一 导入绘图数据 首先导入绘图所需的数据 span class toke
  • 算法题 股票买卖IV(Python)

    题目 https leetcode cn com problems best time to buy and sell stock iv 给定一个长度为 N 的数组 xff0c 数组中的第 i 个数字表示一个给定股票在第 i 天的价格 设计
  • 【Python】情人节表白烟花(带声音和文字)

    今天就是情人节了 xff0c 有想好送什么给亲爱的他 她吗 xff1f 去年5月20日的时候整理了Python浪漫表白源码合集 xff08 爱心 玫瑰花 照片墙 星空下的告白 xff09 xff0c 今天向大家介绍表白烟花 xff0c 祝单
  • 【Python】用pyecharts绘制我国人口分布和迁移地图

    一直很好奇我国人口分布和迁移情况 xff0c 所以想用Python分析一下 由于我国省份较多 xff0c 把数据放在地图上展示会更加清晰 xff0c 故本文用Python中的pyecharts库进行人口分布和迁移绘图展示 pyecharts
  • 模型评价指标—ROC曲线

    对于分类模型 xff0c 在建立好模型后 xff0c 我们想对模型进行评价 xff0c 常见的指标有混淆矩阵 F1值 KS曲线 ROC曲线 AUC面积等 也可以自己定义函数 xff0c 把模型结果分割成n 100 份 xff0c 计算top
  • 模型评价指标—F1值

    最近空余时间在参加数字中国创新大赛 xff0c 比赛规则是根据模型的F1值对参赛者进行排名 为了更深刻地理解这个指标 xff0c 我最近对它做了一些梳理 xff0c 现在把它分享给更多有需要的人图片 最近在参赛时也发现了一个问题 xff0c
  • 【Python常用函数】一文让你彻底掌握Python中的pivot_table函数

    任何事情都是由量变到质变的过程 xff0c 学习Python也不例外 只有把一个语言中的常用函数了如指掌了 xff0c 才能在处理问题的过程中得心应手 xff0c 快速地找到最优方案 本文和你一起来探索Python中的pivot table
  • python画生肖兔

    2022已经过去 xff0c 2023正在继续 xff0c 希望我们都能在平凡的日子里 xff0c 熠熠生辉 本文介绍运用Python中的turtle库控制函数画生肖兔 xff0c 并设置了2023年幸运词 xff0c 快截屏看看你的幸运词
  • 判断变量是否存在

    来获取一个变量是否存在 xff0c 用 if typeof a 61 34 undefined 34 alert 34 ok 34 xff0c xff0c 而不要去使用 if a 因为如果 a 不存在 xff08 未声明 xff09 则会出
  • Nextcloud 内部服务器错误解决

    在部署nextcloud过程中最后登录页面时出现内部服务器错误 xff0c 心态当时就炸了 在网上找了各种方案 xff0c 但是大部分博主都告诉我是 var lib php session 属组的权限问题 xff0c 或者web目录的权限不
  • golang中的(data race )典型数据竞争问题举例

    示例一 func main var wg sync WaitGroup wg Add 5 for i 61 0 i lt 5 i 43 43 go func fmt Println i Not the 39 i 39 you are loo