go之我可以使用锁来确保指令顺序吗

不点 阅读:95 2025-06-02 22:19:02 评论:0

如该链接https://golang.org/ref/mem中所述,以下代码使用了不正确的同步:

var a, b int 
 
func f() { 
    a = 1 
    b = 2 
} 
 
func g() { 
    print(b) 
    print(a) 
} 
 
func main() { 
    go f() 
    g() 
} 

因为它可能会打印a = 0和b = 2。

但是,我想知道下面的代码中用锁保护a和b的代码是否可能实现此结果:

var a, b int 
var mu sync.Mutex 
 
func f() { 
    mu.Lock() 
    a = 1 
    b = 2 
    mu.Unlock() 
} 
 
func g() { 
    mu.Lock() 
    print(b) 
    print(a) 
    mu.Unlock() 
} 
 
func main() { 
    go f() 
    g() 
} 
 

因为该链接显示:
For any sync.Mutex or sync.RWMutex variable l and n < m, call n of l.Unlock() happens before call m of l.Lock() returns.
但是,尚不清楚是否可以保证在 Unlock语句之前执行a和b的赋值

请您参考如下方法:

保证一旦f执行mu.Unlock(),所有读取ab的goroutines都会看到ab的更新值,前提是这些goroutines也使用相同的锁访问ab。如果有goroutines读取不带锁的ab,则存在种族。


标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号