【Go】资源竟态检测工具:race detetor

简介:

试了一下,简直牛逼。鉴于处于快速入门阶段,就不去挖底层原理了,等面铺开了再深入。

用一个有点并发经验的人都能看出来的例子,累加:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var count = 0
    // 使用WaitGroup等待10个goroutine完成
    var wg sync.WaitGroup
    wg.Add(10)
    for i := 0; i < 10; i++ {
        go func() {
            defer wg.Done()
            // 对变量count执行10次加1
            for j := 0; j < 10000; j++ {
                count++
            }
        }()
    }
    // 等待10个goroutine完成
    wg.Wait()
    fmt.Println(count)
}

不上锁时是这样的:

PS C:\Users\Administrator\Desktop\go> go build main.go
PS C:\Users\Administrator\Desktop\go> .\main.exe      
49376

接下来让我们看看 race detetor 的表现:

PS C:\Users\Administrator\Desktop\go> go build -race main.go
PS C:\Users\Administrator\Desktop\go> .\main.exe
==================
WARNING: DATA RACE
Read at 0x00c0000ac078 by goroutine 8:
  main.main.func1()
      C:/Users/Administrator/Desktop/go/main.go:18 +0xa8

Previous write at 0x00c0000ac078 by goroutine 7:
  main.main.func1()
      C:/Users/Administrator/Desktop/go/main.go:18 +0xba

Goroutine 8 (running) created at:
  main.main()
      C:/Users/Administrator/Desktop/go/main.go:14 +0x8d

Goroutine 7 (finished) created at:
  main.main()
      C:/Users/Administrator/Desktop/go/main.go:14 +0x8d
==================
48462
Found 1 data race(s)

懂得都懂,真正项目里的资源竟态隐藏的都很深,一爆出来那死伤是难以估量的。

相关文章
|
6月前
|
存储 Java 测试技术
100 个 Go 错误以及如何避免:1~4
100 个 Go 错误以及如何避免:1~4
153 0
|
3月前
|
存储 安全 算法
了解 Go 中原子操作的重要性与使用方法
了解 Go 中原子操作的重要性与使用方法
|
6月前
|
监控 Go 开发者
Golang深入浅出之-Goroutine泄漏检测与避免:pprof与debug包
【5月更文挑战第2天】本文介绍了Go语言并发编程中可能遇到的Goroutine泄漏问题,以及如何使用`pprof`和`debug`包来检测和防止这种泄漏。常见的问题包括忘记关闭channel和无限制创建goroutine。检测方法包括启动pprof服务器以监控Goroutine数量,使用`debug.Stack()`检查堆栈,以及确保每个Goroutine有明确的结束条件。通过这些手段,开发者可以有效管理Goroutine,维持程序性能。
236 7
|
6月前
|
Go
100 个 Go 错误以及如何避免:9~12
100 个 Go 错误以及如何避免:9~12
385 0
|
6月前
|
测试技术 Go 调度
100 个 Go 错误以及如何避免:5~8
100 个 Go 错误以及如何避免:5~8
64 0
|
缓存 测试技术 Go
使用 go race 排查 protobuf Marshal Panic
使用 go race 排查 protobuf Marshal Panic
167 0
|
Java Go 索引
Go 语言中的 Slice 陷阱:如何避免常见错误
Go 语言提供了很多方便的数据类型,其中包括 slice。然而,由于 slice 的特殊性质,在使用过程中易犯一些错误,如果不注意,可能导致程序出现意外行为。本文将详细介绍 使用 slice 时易犯的一些错误,帮助读者更好的使用 Go 的 slice,避免犯错误。
217 1
Go 语言中的 Slice 陷阱:如何避免常见错误
|
存储 Cloud Native 数据可视化
Go 内存泄漏,pprof 够用了吗?
MOSN 是主要使用 Go 语言开发的云原生网络代理平台,在蚂蚁集团有着几十万容器的大规模生产应用。在这种大规模的应用中,经常会遇到各种内存问题,通常情况下 pprof heap profile 可以很好帮助分析问题。不过,有时候 pprof 也不够用,也就需要我们有更合适的工具了。
Go 内存泄漏,pprof 够用了吗?
|
Go
工作用Go: 异步任务怎么写2 | 简单 Go 并发: 任务编排
工作用Go: 异步任务怎么写2 | 简单 Go 并发: 任务编排
292 0
工作用Go: 异步任务怎么写2 | 简单 Go 并发: 任务编排
|
安全 测试技术 Go
Go 语言快速入门指南: Go 并发互斥锁
互斥是并发编程中最关键的概念之一。当我们使用 goruntine 和 channels 进行并发编程时,如果两个 goruntine 尝试同时访问同一个内存位置的同一数据会发生竞争,有时候会产生意想不到的结果,通常很难调试,不符合日常要求,出现错误甚至很难修复。