gpt4 book ai didi

go - 是否需要同步?

转载 作者:IT王子 更新时间:2023-10-29 01:24:40 27 4
gpt4 key购买 nike

我在一个对象中定义了一个变量(r.something)

func (r *Runner) init() {
r.something = make(map[string]int)
r.something["a"]=1

go r.goroutine()
}

而 r.goroutine 使用存储在 r.something 中的值,没有同步。除了 r.goroutine()

没有其他人会读/写这个值

没有同步是否安全?

换句话说:我想在协程启动之前重用在其他地方初始化的协程中的一些变量。这样安全吗?

补充问题:在 r.goroutine() 完成后,我希望能够从其他地方使用 r.something(没有与其他 goroutines 的读/写重叠)。也安全吗?

最佳答案

当然这是安全的,否则用 Go 编程可能是一场噩梦(或者至少不那么愉快)。 The Go Memory Model是一篇有趣的文章。

例程创建是一个同步点。有一个例子与你的非常相似:

var a string

func f() {
print(a)
}

func hello() {
a = "hello, world"
go f()
}

评论如下:

calling hello will print "hello, world" at some point in the future (perhaps after hello has returned).

这是因为:

The go statement that starts a new goroutine happens before the goroutine's execution begins.

before 一词在这里很重要,因为它暗示例程创建(在一个线程中)必须与其开始同步(可能在其他线程中),因此写入 a新例程必须可见。

关于go - 是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31963075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com