亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 并發寫入變量 - 為什么這段代碼有效?

Golang 并發寫入變量 - 為什么這段代碼有效?

Go
GCT1015 2023-06-19 16:01:07
我正在學習 Golang 中與并發相關的問題。我寫了一些代碼:package mainimport (    "fmt"    "time")func incr(num *int) {    *num = *num + 1}func main() {    var a = 0    for i := 0; i < 50; i++ {        go incr(&a)    }    incr(&a)    time.Sleep(1 * time.Second)    fmt.Println(a)}這段代碼的結果是:51在這段代碼中,我聲明了a在 50 個正在運行的 goroutine 中增加的變量。根據我的閱讀和理解,這段代碼應該會失敗,因為多個 goroutine 正在寫入相同的內存地址。在這種情況下,我應該添加sync.Mutex鎖來解決這個問題。代碼在操場上可用:https ://play.golang.org/p/Tba9pfpxaHY您能解釋一下這個程序中到底發生了什么嗎?
查看完整描述

1 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

你猜怎么了?我運行了您的應用程序,得到了不同的輸出:有時,49,有時,有時(有時)。485051


如果您在啟用競爭檢測器 ( go run -race play.go) 的情況下運行您的應用程序,它會告訴您存在數據競爭:


==================

WARNING: DATA RACE

Read at 0x00c00009a010 by goroutine 7:

  main.incr()

      /home/icza/gows/src/play/play.go:9 +0x3a


Previous write at 0x00c00009a010 by goroutine 6:

  main.incr()

      /home/icza/gows/src/play/play.go:9 +0x50


Goroutine 7 (running) created at:

  main.main()

      /home/icza/gows/src/play/play.go:17 +0x83


Goroutine 6 (finished) created at:

  main.main()

      /home/icza/gows/src/play/play.go:17 +0x83

==================

當你有數據競爭時,你的應用程序的行為是未定義的?!翱此朴袝r工作”也符合“未定義”行為,但未定義也意味著它也可以做任何其他事情。


查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號