2 回答
TA贡献1815条经验 获得超13个赞
我对Go Memory Model的了解是,这是对您编写的程序的正确执行:没有什么可以保证AddUint64()主程序中的调用在goroutine中的调用之前发生LoadUint64(),因此对于每次读取变量的发生都是合法的在发生任何写操作之前。如果编译器知道"sync/atomic"特殊之处并得出增量的结果不可观察的结论,那么我不会感到完全震惊,因此只需删除最终循环即可。
无论转到内存模型和同步/原子的文件建议对您所使用的方法。 "sync/atomic"告诫:
通过通信共享内存;不要通过共享内存进行通信。
一个更好的程序可能看起来像这样:
package main
import "fmt"
import "time"
func count(op <-chan struct{}) {
t1 := time.Now()
ops := 0
tick := time.Tick(time.Second)
for {
select {
case <-op:
ops++
case <-tick:
dt := time.Since(t1).Seconds()
fmt.Printf("ops: %d qps: %f\n", ops, float64(ops)/dt)
}
}
}
func main() {
op := make(chan struct{})
go count(op)
for {
op <- struct{}{}
}
}
请注意,除了通过通道发送的数据外,主程序与goroutine之间没有共享任何状态。
TA贡献1909条经验 获得超7个赞
我将更新go版本,请检查,
[mh-cbon@pc3 y] $ go run main.go
ops: 97465383 qps: 97465383
ops: 195722110 qps: 97861055
ops: 293058057 qps: 97686019
ops: 390971243 qps: 97742810
^Csignal: interrupt
[mh-cbon@pc3 y] $ go version
go version go1.10 linux/amd64
[mh-cbon@pc3 y] $ gvm use 1.8
Now using version go1.8
[mh-cbon@pc3 y] $ go version
go version go1.8 linux/amd64
[mh-cbon@pc3 y] $ go run main.go
ops: 0 qps: 0
ops: 0 qps: 0
^Csignal: interrupt
[mh-cbon@pc3 y] $
- 2 回答
- 0 关注
- 256 浏览
添加回答
举报