2 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
我對(duì)Go Memory Model的了解是,這是對(duì)您編寫的程序的正確執(zhí)行:沒(méi)有什么可以保證AddUint64()主程序中的調(diào)用在goroutine中的調(diào)用之前發(fā)生LoadUint64(),因此對(duì)于每次讀取變量的發(fā)生都是合法的在發(fā)生任何寫操作之前。如果編譯器知道"sync/atomic"特殊之處并得出增量的結(jié)果不可觀察的結(jié)論,那么我不會(huì)感到完全震驚,因此只需刪除最終循環(huán)即可。
無(wú)論轉(zhuǎn)到內(nèi)存模型和同步/原子的文件建議對(duì)您所使用的方法。 "sync/atomic"告誡:
通過(guò)通信共享內(nèi)存;不要通過(guò)共享內(nèi)存進(jìn)行通信。
一個(gè)更好的程序可能看起來(lái)像這樣:
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{}{}
}
}
請(qǐng)注意,除了通過(guò)通道發(fā)送的數(shù)據(jù)外,主程序與goroutine之間沒(méi)有共享任何狀態(tài)。

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
我將更新go版本,請(qǐng)檢查,
[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 關(guān)注
- 286 瀏覽
添加回答
舉報(bào)