
var a string
var done bool
func setup() {
a = "hello, world"
done = true
}
func doprint() {
if !done {
once.do(setup)
}
print(a)
}
func twoprint() {
go doprint()
go doprint()
}
变量:
功能:
main() 中的并发:
潜在问题:
可能的结果
由于缺乏同步,程序的输出是不确定的。以下是可能的情况:
情况 1:g() 在 f() 修改 a 和 b 之前执行:
0 0
或
情况 2:如果 b = 2 在 g() 之前完成,但 a = 1 未完成,则输出可能为:
2 0
主要观察结果
数据竞争:在不同步的情况下对 a 和 b 进行并发访问会引入数据竞争。这使得程序的行为变得不确定且不可预测
修复代码
var a, b int
var wg sync.waitgroup
func f() {
a = 1
b = 2
wg.done()
}
func g() {
print(b)
print(a)
}
func main() {
wg.add(1)
go f()
wg.wait()
g()
}
var a, b int
func f(done chan bool) {
a = 1
b = 2
done <- true
}
func g() {
print(b)
print(a)
}
func main() {
done := make(chan bool)
go f(done)
<-done
g()
}
这里,g() 等待,直到 f() 通过完成的通道发送信号。
以上就是GO:缺乏同步的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号