内容简介:Golang中我们使用Channel或者sync.Mutex等锁保护数据,有没有一种机制可以检测代码中的数据竞争呢?数据竞争是并发情况下,存在多线程/协程读写相同数据的情况,必须存在至少一方写。另外,全是读的情况下是不存在数据竞争的。
Golang中我们使用Channel或者sync.Mutex等锁保护数据,有没有一种机制可以检测代码中的数据竞争呢?
数据竞争是并发情况下,存在多线程/协程读写相同数据的情况,必须存在至少一方写。另外,全是读的情况下是不存在数据竞争的。
使用race检测数据竞争
go build
有个标记 race
可以帮助检测代码中的数据竞争。
➜ awesome git:(master) ✗ go help build
//.... omit
-race
enable data race detection.
Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.
下面举个栗子:
package main
import "fmt"
func main() {
i := 0
go func() {
i++ // write i
}()
fmt.Println(i) // read i
}
测试方法:
➜ awesome git:(master) ✗ go build -race hi.go
➜ awesome git:(master) ✗ ./hi
0
==================
WARNING: DATA RACE
Write at 0x00c00009c008 by goroutine 6:
main.main.func1()
/Users/mac/go/src/github.com/mac/awesome/hi.go:9 +0x4e
Previous read at 0x00c00009c008 by main goroutine:
main.main()
/Users/mac/go/src/github.com/mac/awesome/hi.go:12 +0x88
Goroutine 6 (running) created at:
main.main()
/Users/mac/go/src/github.com/mac/awesome/hi.go:8 +0x7a
==================
Found 1 data race(s)
exit status 66
提示示例代码存在1处数据竞争,说明了数据会在第9行写,并且同时会在12行读形成了数据竞争。
当然你也可以使用 go run
一步到位:
➜ awesome git:(master) ✗ go run -race hi.go
0
==================
WARNING: DATA RACE
Write at 0x00c000094008 by goroutine 6:
main.main.func1()
/Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go:9 +0x4e
Previous read at 0x00c000094008 by main goroutine:
main.main()
/Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go:12 +0x88
Goroutine 6 (running) created at:
main.main()
/Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go:8 +0x7a
==================
Found 1 data race(s)
exit status 66
如果这篇文章对你有帮助,请点个赞/喜欢,让我知道我的写作是有价值的,感谢。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 恶意软件如何绕过AMSI检测以逃避检测
- 行人检测新思路:高级语义特征检测取得精度新突破
- NIC:基于神经网络不变量检测的对抗样本检测
- 智能威胁检测:基于 Spark 的 SOC 机器学习检测平台
- Java并发系列—并发编程基础
- CVPR 2019 | CSP行人检测:无锚点框的检测新思路
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Agile Web Development with Rails, Third Edition
Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95
Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!