繁体   English   中英

是否需要同步?

[英]Is synchronization required?

我在对象内定义了一个变量(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()外,没有其他人会读/写此值。

不进行同步是否安全?

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

另一个问题:r.goroutine()完成后,我希望能够从其他地方使用r.something(不与其他goroutine进行读/写重叠)。 也安全吗?

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

例程创建是一个同步点。 有一个非常类似于您的示例:

var a string

func f() {
    print(a)
}

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

带有以下注释:

呼叫hello会在将来的某个时候(也许在hello返回之后)打印“ hello,world”。

这是因为:

启动新goroutine的go语句在goroutine的执行开始之前发生。

这个词之前在这里至关重要,因为这意味着例程创建(在一个线程)必须与其开始(可能在另一个线程)同步,因此写入一个必须由新的常规可见。

如果在这种情况下不会发生由不同的例程进行的读取和写入操作重叠的情况,那么您是对的:不需要任何同步。

正如您提到的那样,变量是 go例程启动之前初始化的,实际上,您是安全的。

是的,这很安全。 根据Go Memory Model

  • 在开始执行goroutine之前,会执行启动新goroutine的go语句
  • 在单个goroutine中,before-before顺序是程序表示的顺序

这意味着在启动goroutine之前,您对变量所做的所有更改都是可见的。

回答您的其他问题:视情况而定。 通常,如果r.goroutine()修改了r.something并且您想从另一个goroutine中读取它,则需要使用同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM