第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

了解戈魯丁同步

了解戈魯丁同步

Go
www說 2022-09-05 17:59:23
我試圖了解golang通道和同步。當(dāng)我使用種族檢測器運(yùn)行我的程序時,它會導(dǎo)致種族檢測。我的程序:func main() {    ch := make(chan int)    done := make(chan struct{})    wg := sync.WaitGroup{}    go func() {        defer close(ch)        defer close(done)        wg.Wait()        done <- struct{}{}    }()    for i := 0; i < 5; i++ {        x := i        wg.Add(1)        go func() {            defer wg.Done()            fmt.Println("Value: ", x)            ch <- x        }()    }    loop:    for {        select {        case i := <-ch:            fmt.Println("Value: ", i)        case <- done:            break loop        }    }}比賽檢測報(bào)告:==================WARNING: DATA RACEWrite at 0x00c000020148 by goroutine 7:  internal/race.Write()      /home/linuxbrew/.linuxbrew/Cellar/go/1.16.5/libexec/src/internal/race/race.go:41 +0x125  sync.(*WaitGroup).Wait()      /home/linuxbrew/.linuxbrew/Cellar/go/1.16.5/libexec/src/sync/waitgroup.go:128 +0x126  main.main.func1()      /home/reddy/code/github.com/awesomeProject/prod.go:106 +0xc4Previous read at 0x00c000020148 by main goroutine:  internal/race.Read()      /home/linuxbrew/.linuxbrew/Cellar/go/1.16.5/libexec/src/internal/race/race.go:37 +0x206  sync.(*WaitGroup).Add()      /home/linuxbrew/.linuxbrew/Cellar/go/1.16.5/libexec/src/sync/waitgroup.go:71 +0x219  main.main()      /home/reddy/code/github.com/awesomeProject/prod.go:112 +0x124Goroutine 7 (running) created at:  main.main()      /home/reddy/code/github.com/awesomeProject/prod.go:103 +0x104==================我無法弄清楚這里出了什么問題。我的分析:wg.Add(1)正在遞增計(jì)數(shù)器wg.Done()在 goroutine 的末尾調(diào)用,這會遞減計(jì)數(shù)器ch <- x這應(yīng)該是一個阻塞調(diào)用,因?yàn)樗欠蔷彌_通道循環(huán)應(yīng)該迭代,直到完成通道有一些消息,當(dāng)計(jì)數(shù)器變?yōu)榱銜r發(fā)生,即所有5個goroutines都發(fā)布了消息waitgroup一旦計(jì)數(shù)器變?yōu)榱悖琯oroutine將恢復(fù)并完成被調(diào)用,一旦消息在主循環(huán)中被消耗,它就會中斷循環(huán)并應(yīng)優(yōu)雅地退出。wg
查看完整描述

1 回答

?
肥皂起泡泡

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個贊

該程序在調(diào)用wg之間有一場競賽。添加并調(diào)用 wg。等等。這些調(diào)用可以按任何順序發(fā)生。在調(diào)用 之前,調(diào)用 時不等待任何 goroutines。wg.Waitwg.Waitwg.Add


通過在啟動調(diào)用 的 goroutine 之前將調(diào)用移動到 進(jìn)行修復(fù)。此更改可確保在調(diào)用 之前進(jìn)行調(diào)用。wg.Addwg.Waitwg.Addwg.Wait


for i := 0; i < 5; i++ {

    x := i

    wg.Add(1)

    go func() {

        defer wg.Done()

        fmt.Println("Value: ", x)

        ch <- x

    }()

}


go func() {

    defer close(ch)

    defer close(done)

    wg.Wait()

    done <- struct{}{}

}()

該類型具有在競賽檢測器下運(yùn)行時檢查此錯誤的代碼(建模讀取,建模寫入)。WaitGroup


通過在關(guān)閉時中斷主 goroutine 中的循環(huán)來簡化代碼。不需要該通道。chdone


ch := make(chan int)

wg := sync.WaitGroup{}


for i := 0; i < 5; i++ {

    x := i

    wg.Add(1)

    go func() {

        defer wg.Done()

        fmt.Println("Value: ", x)

        ch <- x

    }()

}


go func() {

    wg.Wait()

    close(ch)

}()


for i := range ch {

    fmt.Println("Value: ", i)

}


查看完整回答
反對 回復(fù) 2022-09-05
  • 1 回答
  • 0 關(guān)注
  • 92 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號