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号