On Friday, July 7, 2017 at 8:42:28 PM UTC+8, Marvin Renich wrote:
>
> * T L <tapi...@gmail.com <javascript:>> [170707 01:32]: 
> > Then how about this? 
> > 
> > package main 
> > 
> > import "fmt" 
> > import "sync/atomic" 
> > 
> > func main() { 
> >     var x, y int32 
> >     go func() { 
> >         atomic.AddInt32(&x, 1) 
> >         atomic.AddInt32(&y, 1) 
> >     }() 
> >     
> >     if atomic.LoadInt32(&y) == 1 { 
> >         fmt.Println("x =", atomic.LoadInt32(&x)) // always 1 if it is 
> printed? 
> >     } 
>
> Yes, the go routine establishes a happens-before relationship such that 
> x is incremented before y, and the atomic Add of y and Load of y ensure 
> that the Load either happens before or after, but not during, the Add. 
>

But I remember that the "happens-before relationship" is never written down 
in any official Go documentation.
 

>
> >     if atomic.LoadInt32(&x) == 0 { 
> >         fmt.Println("y =", atomic.LoadInt32(&y)) // always 0 if it is 
> printed? 
> >     } 
>  

No.  If the Load of x returns 0, it must happen before the Add of 1 to x. 
> But after the test and before the Load of y, the main go routine and the 
>
func go routine are both runnable and there is nothing to establish a 
> happens-before relationship between the Load of y and the Add of 1 to y. 
>
> > } 
>
> ...Marvin 
>
>
 Great explanation.

-- 
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.

Reply via email to