On Sunday, 29 January 2017 01:42:08 UTC+11, T L wrote: > > > > 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. >
Finalisers are not guaranteed to run, no matter how long the program runs for, no matter how important they are. > But it looks the current implementation of SetFinalizer can't make any > guarantee at all. > Correct. Finalisers are not guaranteed to run. You should not base the correct operation of your program on a finaliser running before your program exits. > > >> >>> 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.