golang同步/原子包?

时间:2017-10-11 13:05:31

标签: go atomic

我写了一段代码来记录请求的数量。

package main

import (
    "log"
    "net/http"
    "runtime"
    "sync/atomic"
)

var count int32 = 0

func test(w http.ResponseWriter, r *http.Request) {
    count = atomic.LoadInt32(&count)
    atomic.AddInt32(&count, 1)
    log.Println("count:", count)
}
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU() - 1)
    http.HandleFunc("/", test)
    http.ListenAndServe(":8080", nil)
}

我考虑过并发的条件,所以我使用原子pacakge。 我通过apache ab工具测试代码

ab -c 400 -n 1000 http://localhost:8080/

结果是正确的: result 然而,有人说他的计算机上有1004或其他号码,我已经测试了很多次代码,但结果在我的电脑上是正确的,我的方式有问题吗? 我是新来的,提前谢谢。

1 个答案:

答案 0 :(得分:0)

您错误地使用了sync/atomic包。如果您有原子变量,则必须使用原子函数完成 ALL 读写。

以下是您的代码已修复,因此count变量不会以非原子方式写入或读取:

package main

import (
    "log"
    "net/http"
    "runtime"
    "sync/atomic"
)

var count int32

func test(w http.ResponseWriter, r *http.Request) {
    currentCount := atomic.LoadInt32(&count)
    atomic.AddInt32(&count, 1)
    log.Println("count:", currentCount)
}
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU() - 1)
    http.HandleFunc("/", test)
    http.ListenAndServe(":8080", nil)
}