最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang中g(shù)o race使用

 更新時間:2025年12月14日 12:04:42   作者:大口吃飯大口吐  
本文介紹了Go語言中處理多線程/協(xié)程安全問題的方法,重點講解了-race參數(shù)的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

多線程/協(xié)程中的線程安全分析

在項目中,使用多線程會導致線程安全問題,引發(fā)bug發(fā)生,如果是運行中發(fā)生問題更難定位

常見的情況有兩種 死鎖 競爭,例如

死鎖

編譯打包時,死鎖發(fā)生 go run 會直接報錯

兩個或兩個以上的進程(或線程)在執(zhí)行過程中,因爭奪資源而造成的一種相互等待的現(xiàn)象。

競爭

當兩個線程競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態(tài)條件。

Go 的命令中,-race參數(shù)用于啟用競態(tài)檢測器(Race Detector)

雖然說,我們能夠通過規(guī)范的代碼避免死鎖,sync.Mutexchannel規(guī)避線程安全,但總該有個監(jiān)測的過程,以防萬一

go reac就是幫我們干這個事情的,切記,建議在測試環(huán)境中使用?。?!

它能幫助你發(fā)現(xiàn)程序中是否存在多個 goroutine 同時讀寫同一個變量而沒有同步機制的問題

使用方式例如

go test -race mypkg    
go run -race mysrc.go  
go build -race mycmd   
go install -race mypkg 

使用示例

我們故意寫一段,線程危險的程序

package main

import (
	"fmt"
	"time"
)

var counter int = 0

func main() {
	go func() {
		for i := 0; i < 100; i++ {
			counter++ // 寫操作
		}
	}()

	go func() {
		for i := 0; i < 100; i++ {
			counter-- // 寫操作
		}
	}()

	time.Sleep(10 * time.Millisecond) // 等待 goroutine 執(zhí)行(不推薦的方式,僅用于演示)
	fmt.Println("Final counter:", counter)
}

使用go run -race main.go調(diào)試

這里已經(jīng)很清晰的將分析報告、代碼行數(shù)輸出

==================
WARNING: DATA RACE
Read at 0x000001d6bd90 by goroutine 7:
  main.main.func2()
      /Applications/www/blog-code/main.go:19 +0x2c

Previous write at 0x000001d6bd90 by goroutine 6:
  main.main.func1()
      /Applications/www/blog-code/main.go:13 +0x44

Goroutine 7 (running) created at:
  main.main()
      /Applications/www/blog-code/main.go:17 +0x33

Goroutine 6 (finished) created at:
  main.main()
      /Applications/www/blog-code/main.go:11 +0x27
==================
==================
WARNING: DATA RACE
Read at 0x000001d6bd90 by main goroutine:
  main.main()
      /Applications/www/blog-code/main.go:24 +0x77

Previous write at 0x000001d6bd90 by goroutine 7:
  main.main.func2()
      /Applications/www/blog-code/main.go:19 +0x44

Goroutine 7 (finished) created at:
  main.main()
      /Applications/www/blog-code/main.go:17 +0x33
==================
Final counter: 0
Found 2 data race(s)
exit status 66

我們將代碼修改一些,加上安全鎖

// race_fixed.go
package main

import (
	"fmt"
	"sync"
)

var (
	counter int
	mu      sync.Mutex
)

func main() {
	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		defer wg.Done()
		for i := 0; i < 100; i++ {
			mu.Lock()
			counter++
			mu.Unlock()
		}
	}()

	go func() {
		defer wg.Done()
		for i := 0; i < 100; i++ {
			mu.Lock()
			counter--
			mu.Unlock()
		}
	}()

	wg.Wait()
	fmt.Println("Final counter:", counter) // 應(yīng)該輸出 0
}

再次執(zhí)行 go run -race main.go 將沒有警告輸出

Final counter: 0

注意

  1. 不要用于生產(chǎn)環(huán)境
  2. -race 會顯著降低程序性能(約 2–10 倍變慢),內(nèi)存占用也更高
  3. windows下需有gcc環(huán)境,且與go的版本匹配,例如 go.1.22 使用 gcc version 8.1 會有異常發(fā)生,推薦使用 gcc14.2

到此這篇關(guān)于golang中g(shù)o race使用的文章就介紹到這了,更多相關(guān)go race使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO中GORM 使用教程

    GO中GORM 使用教程

    GORM是Go語言的ORM庫,它將關(guān)系型數(shù)據(jù)庫表與Go語言結(jié)構(gòu)體映射,提供便捷的數(shù)據(jù)庫操作,本文就來介紹有下GO中GORM 使用教程,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • golang如何解決go get命令無響應(yīng)問題

    golang如何解決go get命令無響應(yīng)問題

    文章介紹了在Go語言中處理由于官方庫被封禁導致依賴下載失敗的方法,包括設(shè)置代理和直接克隆依賴包到GOPATH/src下
    2024-12-12
  • Go語言的管道Channel用法實例

    Go語言的管道Channel用法實例

    這篇文章主要介紹了Go語言的管道Channel用法,實例分析了Go語言中管道的原理與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • golang 中的 nil的場景分析

    golang 中的 nil的場景分析

    這篇文章主要介紹了golang 中的 nil,本文通過多種場景分析給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Golang 處理浮點數(shù)遇到的精度問題(使用decimal)

    Golang 處理浮點數(shù)遇到的精度問題(使用decimal)

    本文主要介紹了Golang 處理浮點數(shù)遇到的精度問題,不使用decimal會出大問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • go語言中l(wèi)inkname的用法

    go語言中l(wèi)inkname的用法

    這篇文章主要介紹了go語言中l(wèi)inkname的用法,本文給點俺家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • golang 兩個go程輪流打印一個切片的實現(xiàn)

    golang 兩個go程輪流打印一個切片的實現(xiàn)

    這篇文章主要介紹了golang 兩個go程輪流打印一個切片的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Go語言實現(xiàn)釘釘發(fā)送通知

    Go語言實現(xiàn)釘釘發(fā)送通知

    本文通過代碼給大家介紹了Go語言實現(xiàn)釘釘發(fā)送通知,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • 聊聊Golang性能分析工具pprof的使用

    聊聊Golang性能分析工具pprof的使用

    對于線上穩(wěn)定運行的服務(wù)來說,?可能會遇到?cpu、mem?利用率升高的問題,那我們就需要使用?pprof?工具來進行性能分析,所以本文就來和大家講講pprof的具體使用吧
    2023-05-05
  • Go中的代碼換行問題

    Go中的代碼換行問題

    這篇文章主要介紹了Go中的代碼換行問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

肃宁县| 邯郸市| 商洛市| 林州市| 桐梓县| 襄汾县| 读书| 唐山市| 五台县| 视频| 敦化市| 宝清县| 河曲县| 楚雄市| 桂阳县| 阳江市| 东至县| 大名县| 乌鲁木齐县| 武平县| 云霄县| 峨边| 祁连县| 竹山县| 岫岩| 亚东县| 普宁市| 丰镇市| 梁河县| 武穴市| 综艺| 高安市| 高雄市| 西宁市| 宿州市| 哈巴河县| 沐川县| 大厂| 高青县| 大竹县| 兰州市|