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(),所有读取a和b的goroutines都会看到a和b的更新值,前提是这些goroutines也使用相同的锁访问a和b。如果有goroutines读取不带锁的a和b,则存在种族。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



