mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 12:32:21 +00:00
commit
89285eb1fb
@ -199,47 +199,43 @@ func main() {
|
|||||||
|
|
||||||
## 不同Goroutine之间不满足顺序一致性内存模型
|
## 不同Goroutine之间不满足顺序一致性内存模型
|
||||||
|
|
||||||
因为在不同的Goroutine,main函数可能无法观测到done的状态变化, 那么for循环会陷入死循环:
|
因为在不同的Goroutine,main函数中无法保证能打印出`hello, world`:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
var msg string
|
var msg string
|
||||||
var done bool = false
|
var done bool
|
||||||
|
|
||||||
|
func setup() {
|
||||||
|
msg = "hello, world"
|
||||||
|
done = true
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
runtime.GOMAXPROCS(1)
|
go setup()
|
||||||
|
for !done {
|
||||||
go func() {
|
|
||||||
msg = "hello, world"
|
|
||||||
done = true
|
|
||||||
}()
|
|
||||||
|
|
||||||
for {
|
|
||||||
if done {
|
|
||||||
println(msg)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
println(msg)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
解决的办法是用显示同步:
|
解决的办法是用显式同步:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
var msg string
|
var msg string
|
||||||
var done = make(chan bool)
|
var done = make(chan bool)
|
||||||
|
|
||||||
|
func setup() {
|
||||||
|
msg = "hello, world"
|
||||||
|
done <- true
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
runtime.GOMAXPROCS(1)
|
go setup()
|
||||||
|
|
||||||
go func() {
|
|
||||||
msg = "hello, world"
|
|
||||||
done <- true
|
|
||||||
}()
|
|
||||||
|
|
||||||
<-done
|
<-done
|
||||||
println(msg)
|
println(msg)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
msg的写入是在channel发送之前,所以能保证打印`hello, world`
|
||||||
|
|
||||||
## 闭包错误引用同一个变量
|
## 闭包错误引用同一个变量
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user