So it is neither a bug nor a feature.
It is just that the program is not well written which makes its behavior 
compiler dependent. 

On Thursday, September 7, 2017 at 4:54:16 PM UTC-4, T L wrote:
>
> firstly, finalizers are never guaranteed to be run.
> secondly, there are many modifications/improvements in
> the garbage collection implementation in the official Go compiler, from 
> version to version.
> The garbage collection implementation in Go 1.8 is better than Go 1.7
> so that the S object is finalized earlier than Go 1.7.
>
> On Thursday, September 7, 2017 at 12:21:33 PM UTC-4, Huafeng wrote:
>>
>> package main
>>
>> import (
>>    "sync"
>>    "runtime"
>> )
>>
>> type S struct {
>>    chs chan int
>> }
>>
>> var wg sync.WaitGroup
>>
>> func worker(s *S) {
>>    for i := range s.chs {
>>       println("In worker, ch = ", i)
>>    }
>>
>>    wg.Done()
>> }
>>
>> func main() {
>>    s := S{make(chan int)}
>>
>>    runtime.SetFinalizer(&s, func(ss *S) {
>>       println("Finalizer")
>>       close(ss.chs)
>>    })
>>
>>
>>    wg.Add(1)
>>
>>    go worker(&s)
>>    for i := 0; i < 1; i++ {
>>       s.chs <- 1
>>    }
>>
>>    runtime.GC()
>>
>>    wg.Wait()
>> }
>>
>>
>> *Output (Go 1.8.3):*
>>
>>
>> In worker, ch =  1
>> Finalizer
>>
>>
>>
>> ---
>>
>> As my expectation,  runtime.GC() will not collect `s` , because `worker` 
>> still holds a reference to `s.chs`. So that the program would deadlock.
>>
>> However, this program terminates in go 1.8.3, while deadlocks in go 1.7.
>>
>> Does something change in go 1.8.3? 
>>
>> I guess it has something to do with `range` and `channel`, but know 
>> nothing more .
>>
>> Does anyone know what happens  to this garbage collection process?
>>
>> Thanks very much for reading this.
>>
>>
>>

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