And how about this one. Also no guarantees to always print 1? package main
import "fmt" import "sync/atomic" import "runtime" func main() { runtime.GOMAXPROCS(1) var a, b int32 = 0, 0 go func() { atomic.AddInt32(&a, 1) atomic.AddInt32(&b, 1) }() for { if n := atomic.LoadInt32(&b); n == 1 { fmt.Println(atomic.LoadInt32(&a)) // always print 1? break } runtime.Gosched() } } On Sunday, October 22, 2017 at 9:59:11 AM UTC-4, T L wrote: > > So the Go 1 memory model really make no guarantees that the following > program will print 1? > > package main > > import "fmt" > import "sync/atomic" > import "runtime" > > func main() { > runtime.GOMAXPROCS(1) > var a, b int32 = 0, 0 > > go func() { > a = 1 > atomic.AddInt32(&b, 1) > }() > > for { > if n := atomic.LoadInt32(&b); n == 1 { > fmt.Println(a) // always print 1? > break > } > runtime.Gosched() > } > > On Sunday, October 22, 2017 at 6:33:42 AM UTC-4, T L wrote: >> >> >> >> On Sunday, October 22, 2017 at 5:55:54 AM UTC-4, Jan Mercl wrote: >>> >>> On Sun, Oct 22, 2017 at 9:19 AM T L <tapi...@gmail.com> wrote: >>> >>> > why? >>> >>> The OP code with line numbes: https://play.golang.org/p/4fmiWqDDc1 >>> >>> The main goroutine busy loops at lines 15-20. Because of that the >>> goroutine at line 10 may never run and thus line 17 may never get executed. >>> If so, line 18 and thus also lines 27 and above may also never get executed. >>> >>> -- >>> >>> -j >>> >> >> Aha, yes, if GOMAXPROCS is 1, then the main goroutine will become greedy. >> >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.