初级会员
  • 第 45680 位会员
  • zzustu
  • WangZY
  • 2019-11-27 16:07:19
  • Offline
  • 1516 53 75

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 关于进度条问题
    https://studygolang.com/topics/14174
  • 评论了主题 sync包once小问题
    #16 @jan-bar 感谢,这个答案基本上回答了我所有的疑问
  • 评论了主题 sync包once小问题
    #11 @wuxq 感谢解答,其实道理我能理解,但是就代码论代码,如果 sync.Once 写成如下这样,会有线程安全问题吗?如果有,会哪些地方有线程安全问题。 ```go type Once struct { done uint32 m Mutex } func (o *Once) Do(f func()) { if o.done == 0 { o.doSlow(f) } } func (o *Once) doSlow(f func()) { o.m.Lock() defer o.m.Unlock() if o.done == 0 { defer o.done = 1 f() } } ```
  • 评论了主题 sync包once小问题
    还有一个疑问就是既然用了 `atomic` 为何又没贯彻 `atomic`,`doSlow` 锁里面为何用 `if o.done == 0` 而不是 `if atomic.LoadUint32(&o.done) == 0`
  • 评论了主题 sync包once小问题
    #7 @lxzan 疑问不在于为什么有了原子操作还要加锁,而是有了加锁还要用原子操作, 如下写法会有线程安全问题吗? ```go type Once struct { done uint32 m Mutex } func (o *Once) Do(f func()) { if o.done == 0 { o.doSlow(f) } } func (o *Once) doSlow(f func()) { o.m.Lock() defer o.m.Unlock() if o.done == 0 { defer o.done = 1 f() } } ```