MST

星途 面试题库

面试题:Go语言竞态检测器如何检测读写冲突

在Go语言中,简要描述竞态检测器是怎样识别出代码中存在的读写共享资源冲突的?可以举例说明。
26.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 识别原理
    • Go语言的竞态检测器通过在程序执行期间记录内存访问信息来工作。
    • 它跟踪每个goroutine的内存读/写操作,并检查是否存在对共享变量的并发读/写操作,且没有适当的同步机制(如互斥锁mutex等)。
    • 当一个goroutine对共享变量进行读或写操作时,竞态检测器会记录该操作的时间戳和相关信息。如果另一个goroutine在没有同步的情况下,在相近时间内对同一共享变量进行不同类型(读与写、写与写)的操作,就会检测到竞态条件。
  2. 示例代码
package main

import (
    "fmt"
    "sync"
)

var sharedVar int

func increment(wg *sync.WaitGroup) {
    for i := 0; i < 1000; i++ {
        sharedVar++
    }
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Final value of sharedVar:", sharedVar)
}
  • 在这个示例中,多个goroutine同时对sharedVar进行写操作(sharedVar++),但没有使用任何同步机制。
  • 运行时启用竞态检测器(在命令行使用go run -race main.gogo build -race 等方式),竞态检测器就会检测到对sharedVar的并发写操作冲突,并给出相应的错误提示。