标签:多线程 sync 多协成 调用 done atomic 执行 Once
https://www.jianshu.com/p/c9f1b0fe9bed
sync.Once
倒数第三 2018.06.13 15:02:56字数 143阅读 878once结构是这样的
type Once struct {
m Mutex
done uint32
}
其中只有这么一个方法
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 1 {
return
}
// Slow-path.
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
作用是保证多个协程只执行某个函数一次
为什么不能使用CAS原子操作来替代锁呢?
if atomic.CompareAndSwapUint32(&o.done, 0, 1){
f()
}
在多线程调用如下代码的情况下
once.DO(a)
b()
若用原子操作,多线程情况下,执行b的时候,a并不一定成功执行(可能第一次调用Do的线程正在执行中,别的线程再调用会直接返回,造成并未成功执行a的情况下执行b)
标签:多线程,sync,多协成,调用,done,atomic,执行,Once 来源: https://www.cnblogs.com/rincloud/p/16281671.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。