猿问

等待组数据同步保证

去内存模型,声明如下:


修改由多个 goroutine 同时访问的数据的程序必须序列化此类访问。若要序列化访问,请使用通道操作或其他同步基元(如同步和同步/原子包中的同步基元)保护数据。


可悲的是,文档没有具体说明它们与什么相关。synchronization primitive


我的问题,是否包含在那些?WaitGroupsynchronization primitives


根据上面的语句,在下面的代码中,可能永远不会被视为 true:done


var a string

var done bool


func setup() {

    a = "hello, world"

    done = true

}


func main() {

    go setup()

    for !done {

    }

    print(a)

}

WaitGroup 是否保证一旦被调用,在组的 goroutines 执行中写入共享内存的值将以最新的值显示?waitgroup.Wait()


换句话说,下面的代码是否保证打印“hello”?(操场)


package main


import (

    "sync"

)


var a string = "start"

var wg sync.WaitGroup


func hello() {

    wg.Add(1)

    go func() { 

        a = "hello" 

        wg.Done()

    }()

    wg.Wait()

    print(a)

}


func main() {

    hello()

}


浮云间
浏览 104回答 1
1回答

繁星淼淼

您的问题的答案都是:是的。 是一个同步基元,这就是为什么它在包中的原因。对 的调用保证您将看到 正确的值。代码保证打印“hello”。WaitGroupsyncWait()a没什么可说的。
随时随地看视频慕课网APP

相关分类

Go
我要回答