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.

Reply via email to