【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)

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

相关文章
|
8月前
|
存储 Java 测试技术
100 个 Go 错误以及如何避免:1~4
100 个 Go 错误以及如何避免:1~4
169 0
|
存储 编译器 Go
Go 语言内存逃逸案例
Go 语言内存逃逸案例
68 0
|
5月前
|
设计模式 Java 编译器
Go - 基于逃逸分析来提升程序性能
Go - 基于逃逸分析来提升程序性能
52 2
|
8月前
|
缓存 算法 安全
浅谈go垃圾回收与竞争检测
【5月更文挑战第16天】Go语言的运行时聚焦于垃圾回收(GC)和并发特性。GC通过微小和小对象分配器管理内存,大于32KB的大对象直接分配。GC是并发的,使用写屏障和非压缩策略,分为扫描终止、标记、标记终止和扫除四个阶段。竞争检测用于查找数据竞争,debug包提供运行时调试功能,如堆栈跟踪。内部的atomic包提供原子操作保证线程安全,math包检测数学溢出。sys包包含系统特定常量,NotInHeap结构确保某些对象不被GC管理。
76 5
浅谈go垃圾回收与竞争检测
|
8月前
|
监控 Go 开发者
Golang深入浅出之-Goroutine泄漏检测与避免:pprof与debug包
【5月更文挑战第2天】本文介绍了Go语言并发编程中可能遇到的Goroutine泄漏问题,以及如何使用`pprof`和`debug`包来检测和防止这种泄漏。常见的问题包括忘记关闭channel和无限制创建goroutine。检测方法包括启动pprof服务器以监控Goroutine数量,使用`debug.Stack()`检查堆栈,以及确保每个Goroutine有明确的结束条件。通过这些手段,开发者可以有效管理Goroutine,维持程序性能。
297 7
|
8月前
|
测试技术 Go 调度
100 个 Go 错误以及如何避免:5~8
100 个 Go 错误以及如何避免:5~8
82 0
|
8月前
|
Go
100 个 Go 错误以及如何避免:9~12
100 个 Go 错误以及如何避免:9~12
406 0
|
编译器 Go
Go死码消除
Go死码消除
82 0
|
缓存 测试技术 Go
使用 go race 排查 protobuf Marshal Panic
使用 go race 排查 protobuf Marshal Panic
184 0