教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 轻松检测Golang并发的数据竞争

轻松检测Golang并发的数据竞争

发布时间:2023-01-04   编辑:jiaochengji.com
教程集为您提供轻松检测Golang并发的数据竞争等资源,欢迎您收藏本站,我们将为您提供最新的轻松检测Golang并发的数据竞争资源

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
如果这篇文章对你有帮助,请点个赞/喜欢,让我知道我的写作是有价值的,感谢。
到此这篇关于“轻松检测Golang并发的数据竞争”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想学一门新的编程语言?考虑一下Go (Golang)吧
SEO竞争对手分析之常见问题
【go】gopl学习笔记(6.基于共享变量的并发)
google左侧排名,我们是如何做到的
golang数据竞态
golang gui编程_从Go编程中学到的教训
goroutine 调度器
2011年网络最挣钱的几个手段
redis基础问答
rust golang_Rust vs. Go:如何选择

[关闭]
~ ~