我有一个http服务器。它是用Go编写的。 我有这段代码:
package main
import (
"net/http"
"runtime"
)
var cur = 0
func handler(w http.ResponseWriter, r *http.Request) {
cur = cur + 1;
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
http.HandleFunc("/", handler)
http.ListenAndServe(":9010", nil)
}
安全吗? 可能我需要使用互斥锁吗?
答案 0 :(得分:4)
不,它不安全,是的,你需要锁定某种形式。 每个连接都在自己的goroutine中处理。有关详细信息,请参阅the Serve() implementation。
一般模式是使用goroutine来检查频道并接受更改 通过渠道:
var counterInput = make(chan int)
func handler(w http.ResponseWriter, r *http.Request) {
counterInput <- 1
}
func counter(c <- chan int) {
cur := 0
for v := range c {
cur += v
}
}
func main() {
go counter(counterInput)
// setup http
}
相关:Is "net/http"'s use of global variables considered a good practice in golang?。
答案 1 :(得分:1)
除非我忽略了某些内容,否则在这种情况下,您可以使用sync/atomic
包中的the tools来代替使用锁(或频道)(尽管您需要制作)您的类型为int32
或int64
)
尽管如此,文档本身也会推荐你。
这些功能需要非常小心才能正确使用。除了特殊的低级应用程序,最好使用通道或同步包的功能来实现同步。通过沟通分享记忆;不要通过共享记忆来沟通。