这些守则简单如下:
package main
import (
"fmt"
// "sync"
"time"
)
var count = uint64(0)
//var l sync.Mutex
func add() {
for {
// l.Lock()
// fmt.Println("Start ++")
count++
// l.Unlock()
}
}
func main() {
go add()
time.Sleep(1 * time.Second)
fmt.Println("Count =", count)
}案例:
所以..。我在共享变量中的用法出了什么问题.?我的问题是:
环境: 1. go版本go1.8linux/amd64 64 2.3.3.10.0-123.el7.x86_64 3. CentOS Linux版本7.0.1406 (核心)
发布于 2017-05-25 05:54:28
没有任何同步,你就没有任何保证。
可能有多种原因,在第一种情况下可以看到“Count=0”:
您的版本之间的差异--只有第16行是注释/未注释--可能只是因为运行时,因为到终端的打印可能非常慢。
对于一个正确的程序,您需要在您的主程序中睡眠之后和在fmt.Println之前另外锁定互斥锁,然后再解锁它。但是对于输出不可能有一个确定的期望,因为结果会随机器/os/.
发布于 2017-05-25 05:54:36
您可以在count上进行数据竞争。结果不明确。
package main
import (
"fmt"
// "sync"
"time"
)
var count = uint64(0)
//var l sync.Mutex
func add() {
for {
// l.Lock()
// fmt.Println("Start ++")
count++
// l.Unlock()
}
}
func main() {
go add()
time.Sleep(1 * time.Second)
fmt.Println("Count =", count)
}输出:
$ go run -race racer.go
==================
WARNING: DATA RACE
Read at 0x0000005995b8 by main goroutine:
runtime.convT2E64()
/home/peter/go/src/runtime/iface.go:255 +0x0
main.main()
/home/peter/gopath/src/so/racer.go:25 +0xb9
Previous write at 0x0000005995b8 by goroutine 6:
main.add()
/home/peter/gopath/src/so/racer.go:17 +0x5c
Goroutine 6 (running) created at:
main.main()
/home/peter/gopath/src/so/racer.go:23 +0x46
==================
Count = 42104672
Found 1 data race(s)
$ 参考文献:
https://stackoverflow.com/questions/44171945
复制相似问题