Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is synchronization required?

Tags:

go

goroutine

I defined a variable (r.something) inside an object

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

  go r.goroutine()
}

while r.goroutine uses value stored in r.something with no synchronization. Nobody else is going to read/write this value except r.goroutine()

Is it safe to do without synchronization?

In other words: I want to reuse some variable from a goroutine initialized somewhere else before goroutine start. Is that safe?

Additional question: After r.goroutine() finishes I want to be able to use r.something from somewhere else(without read/write overlap with other goroutines). Is it safe too?

like image 285
let4be Avatar asked Aug 12 '15 10:08

let4be


1 Answers

Of course this is safe, otherwise programming in Go might be a nightmare (or at least much less pleasant). The Go Memory Model is an interesting piece to read.

The routine creation is a synchronisation point. There is an example very similar to yours:

var a string

func f() {
    print(a)
}

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

With the following comment:

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

This is because:

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

The word before is crucial here as it implies routine creation (in one thread) must be synchronised with its start (possibly in other thread), so writes to a must be visible by the new routine.

like image 198
tomasz Avatar answered Sep 22 '22 19:09

tomasz