为什么我的go build -race main.go生成的可执行文件main.exe无任何输出

1. 运行环境

go version go1.21.0 windows/amd64> (当前使用的Go版本,及系统版本、系统架构?)
编译工具:vscode 1.82.1

2. 问题描述?

package main
import (
“fmt”
“sync”
“time”
)
var m = make(map[int]int, 0)
var wg sync.WaitGroup
func test(num int) {
var sum = 1
for i := 1; i <= num; i++ {
sum *= i
}
m[num] = sum
fmt.Println(m)
time.Sleep(time.Millisecond)
wg.Done()
}
func main() {
for i := 1; i <= 200; i++ {
wg.Add(1)
go test(i)
}
wg.Wait()
}
//上述代码发生了资源竞争的情况,我想用go build -race 追踪竞争的情况

3. 您期望得到的结果?

我期望执行go build -race main.go命令后,vscode的终端显示如下图所示的提示信息:

4. 您实际得到的结果?

但实际上我执行go build -race main.go命令后,虽然生成了main.exe可执行文件,但是执行main.exe文件无任何输出。
但是我执行go run main.go命令后,是有如下错误提示的:
fatal error: concurrent map writes
map[2:0 3:6]
fatal error: concurrent map writes
另外,我执行go build main.go命令后,执行生成main.exe文件编译器也会给出相应的提示,唯独执行go build -race main.go命令后,执行生成main.exe文件编译器无任何提示输出。
针对这个问题,我已做了如下尝试:
1、更换MinGW-w64源,现在安装的是x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0版本
2、查看资料,了解vscode是否需要配置gcc环境,但从搜索结果来看,并没有说需要配置gcc环境的帖子

讨论数量: 3

电脑重启一下看看

7个月前 评论

需要加锁访问

package main

import (
    "fmt"
    "sync"
    "time"
)

var m = make(map[int]int, 0)
var wg sync.WaitGroup
var l sync.Mutex

func test(num int) {
    var sum = 1
    for i := 1; i <= num; i++ {
        sum *= i
    }
    //加锁操作
    l.Lock()
    m[num] = sum
    fmt.Println(m)
    l.Unlock()
    time.Sleep(time.Millisecond)
    wg.Done()
}
func main() {
    for i := 1; i <= 200; i++ {
        wg.Add(1)
        go test(i)
    }
    wg.Wait()
}
7个月前 评论
Oraoto

官方文档

On Windows, the race detector runtime is sensitive to the version of the C compiler installed; as of Go 1.21, building a program with -race requires a C compiler that incorporates version 8 or later of the mingw-w64 runtime libraries. You can test your C compiler by invoking it with the arguments –print-file-name libsynchronization.a. A newer compliant C compiler will print a full path for this library, whereas older C compilers will just echo the argument.

需要 C 编译器,需要 mingw-w64 v8 或以上。

7个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!