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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With