On Saturday, January 28, 2017 at 10:33:08 PM UTC+8, Dave Cheney wrote: > > > > On Sunday, 29 January 2017 01:25:20 UTC+11, T L wrote: >> >> >> >> On Saturday, January 28, 2017 at 9:33:51 PM UTC+8, C Banning wrote: >>> >>> From the doc: "The finalizer for obj is scheduled to run at some >>> arbitrary time after obj becomes unreachable. There is no guarantee that >>> finalizers will run before a program exits, so typically they are useful >>> only for releasing non-memory resources associated with an object during a >>> long-running program." >>> >> >> >> If this is true, then the SetFinalizer function would be much meaningless. >> > > Yes. The only reasonable way to interpret the operation of SetFinalizer is > to assume it does not thing and program accordingly. > > To repeat, you cannot base the correct operation of your program on a > finaliser running before your program exits. >
I know, I just want to make sure some fanalizers will get executed for a long running program. But it looks the current implementation of SetFinalizer can't make any guarantee at all. > >> BTW, it looks both finalizer will get executed if let the program sleep >> more than 10us at the beginning: >> >> package main >> >> import "time" >> import "runtime" >> >> func main() { >> time.Sleep(10 * time.Microsecond) >> // if sleep 10 Microsecond here, 2 and 1 will both be out >> // if sleep 1 Microsecond here, still only 2 will out >> >> t1 := new(int) >> t2 := new(int) >> >> runtime.SetFinalizer(t1, func(*int) {println(1)}) >> runtime.SetFinalizer(t2, func(*int) {println(2)}) >> runtime.GC() >> time.Sleep(time.Second * 20) >> } >> >> >>> >>> >>> On Saturday, January 28, 2017 at 6:17:37 AM UTC-7, T L wrote: >>>> >>>> >>>> >>>> package main >>>> >>>> import "time" >>>> import "runtime" >>>> >>>> type T1 struct{ i int } >>>> type T2 struct{ i int } >>>> >>>> func main() { >>>> t1 := new(T1) >>>> t2 := new(T2) >>>> >>>> runtime.SetFinalizer(t1, func(*T1) {println(1)}) >>>> runtime.SetFinalizer(t2, func(*T2) {println(2)}) >>>> runtime.GC() >>>> time.Sleep(time.Second * 2) >>>> >>>> // the program will output: 2 >>>> // if I adjust the order of the declarations of t1 and t2, >>>> // the program will output: 1 >>>> } >>>> >>>> Why the finalizer for the first declaration will not get called? >>>> >>> -- 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.