Golang同步示例与错误代码分析
Golang同步示例与错误代码分析
var a string
var done bool
func setup() {
a = "hello, world"
done = true
}
func main() {
go setup()
for !done {
}
print(a)
}
在这个教程中,它声称上面的主函数在某些情况下可能永远不会结束:
“更糟糕的是,由于两个线程之间没有同步事件,无法保证主函数能够观察到对done的写入。不能保证main中的循环会结束。”
这怎么可能呢?难道主函数不再读取堆变量done了吗,请解释一下?
更多关于Golang同步示例与错误代码分析的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
编译器会优化掉这个循环,因为它没有任何实际作用。之所以这样做,是因为编译器假设 done 变量永远不会被其他协程修改。这种假设是语言规范所允许的,因此编译器可以积极地对编译后的代码进行优化。
这样做的后果是,当我们希望避免此类优化时,就需要显式地使用特殊变量和函数。
这个例子并不能很好地证明同步机制的必要性,因为它没有向不了解编译器假设的读者清晰地展示问题所在。
更多关于Golang同步示例与错误代码分析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


