登录
首页 >  Golang >  Go问答

同步原语原子包

来源:stackoverflow

时间:2024-04-25 17:03:31 241浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《同步原语原子包》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

go 中的同步包有 once 原语。 do()方法实现了

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()
    }
}

为什么我不能使用此方法的其他版本?

func (o *Once) Do(f func()) {
    if o.done == 1 {
        return
    }
    // Slow-path.
    o.m.Lock()
    defer o.m.Unlock()
    if o.done == 0 {
        defer atomic.StoreUint32(&o.done, 1)
        f()
    }
}

解决方案


Go memory model 不保证您对 if o.done == 1done 的读取将自动进行。在这些情况下,您的程序的行为是未定义的。有很多方法可能会出错——例如,您可能会读取另一个 goroutine 中写出的部分值。

好了,本文到此结束,带大家了解了《同步原语原子包》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>