• 端贺
    2020-11-12
    问题一:分离固定内容和非固定内容,使得固定的内容能被内联调用,从而优化执行过程。 问题二:Once被拷贝的过程中内部的已执行状态不会改变,所以Once不能通过拷贝多次执行。 不知道回答对不对,请老师指点。

    作者回复: 对

    共 3 条评论
    17
  • 大力
    2020-11-16
    请教这里所说的内联,提高执行效率是什么意思?

    作者回复: 你可以搜一下golang inline,有几位大牛已经介绍了内联优化的知识

    
    6
  • moooofly
    2020-10-29
    请教一个问题,在示例代码中有如下片段 ``` func (o *Once) doSlow(f func()) { o.m.Lock() defer o.m.Unlock() // 双检查 if o.done == 0 { defer atomic.StoreUint32(&o.done, 1) f() } } ``` 在双检查整改地方,读取 o.done 的值并没有使用使用 atomic.LoadUint32(&o.done) 的方式,按照我的理解,是因为已经处于 o.m.Lock() 的保护下的缘故;那是否 atomic.StoreUint32(&o.done, 1) 也可以直接 o.done = 1 呢?毕竟这个代码也在 o.m.Lock() 的保护下

    作者回复: fast path中读取o.done,并没有在mutex保护之下

    共 12 条评论
    6
  • 🍀柠檬鱼也是鱼
    2020-10-28
    once为什么不直接加锁,还需要加多一个 双重检测呢?这块不太懂,望老师解答,我的理解是,调用do()之后直接上锁,等执行完f()再解锁不就行了吗

    作者回复: 因为有并发初始化的问题

    共 4 条评论
    6
  • Linuxer
    2020-10-28
    第一个思考题:Linux内核也有很多这种fast code path和slow code path,我想这样划分是不是内聚性更好,实现更清晰呢,从linux性能分析来看,貌似更多关注点是在slow code path 第二个思考题:应该不可以吧,Once的内部状态已经被改变了

    作者回复: fast path的一个好处是此方法可以内联

    
    4
  • Geek_69bcfa
    2023-03-22 来自湖南
    // 值是3.0或者0.0的一个数据结构 var threeOnce struct { sync.Once v *Float } // 返回此数据结构的值,如果还没有初始化为3.0,则初始化 func three() *Float { threeOnce.Do(func() { // 使用Once初始化 threeOnce.v = NewFloat(3.0) }) return threeOnce.v } 这个代码里 NewFloat(3.0),那后面程序用完后怎么释放这个new出来的内存?是否建议在 程序退出前对这个做一下 delete 呢?

    作者回复: 程序退出就释放,这是操作系统的事

    
    
  • INFRA_1
    2022-11-01 来自北京
    求分享第一题答案

    作者回复: 看评论,第一位已经回答,方便内联,提升性能

    
    
  • i_chase
    2022-07-23
    还可以只内联函数在doSlow的前的部分吗,一直以为内联是将整个函数内联上去了

    作者回复: 内联整个函数

    
    
  • xl666
    2022-02-09
    ‘’这确实是一种实现方式,但是,这个实现有一个很大的问题,就是如果参数 f 执行很慢的话,后续调用 Do 方法的 goroutine 虽然看到 done 已经设置为执行过了,但是获取某些初始化资源的时候可能会得到空的资源,因为 f 还没有执行完。‘’老师我们运行Do初始化的时候 一般加锁保证线程安全 那就就是说 抢到锁的gofunc在初始化fn()没有运行结束时不会释放锁 其他gofunc进不来 所以不会导致上面说的那种情况 我是这样理解的 要是初始化不加锁倒是会

    作者回复: 其它goroutine也在等待锁啊,等第一个释放锁后就进来了

    
    
  • Bynow
    2021-12-17
    请问:(*uint32)(unsafe.Pointer(&o.Once)) 这个表达式为什么会是1?

    作者回复: 这是unsafe.Pointer常用方法,你可以找这个类型的教程深入了解下

    
    