猿问

转到 http 服务器和全局变量

我有一个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)

}

安全吗?我可能需要使用互斥锁吗?


牛魔王的故事
浏览 207回答 2
2回答

紫衣仙女

不,这不安全,是的,您需要锁定某种形式。每个连接都在它自己的 goroutine 中处理。有关详细信息,请参阅Serve() 实现。一般模式是使用 goroutine 检查通道并通过通道接受更改:var counterInput = make(chan int)func handler(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; counterInput <- 1}func counter(c <- chan int) {&nbsp; &nbsp; cur := 0&nbsp; &nbsp; for v := range c {&nbsp; &nbsp; &nbsp; &nbsp; cur += v&nbsp; &nbsp; }}func main() {&nbsp; &nbsp; go counter(counterInput)&nbsp; &nbsp; // setup http}

牧羊人nacy

除非我忽视的东西,在这种情况下,而不是使用锁(或频道),你可以使用的工具发现,在sync/atomic包(虽然你需要让你的类型无论是int32或int64)但是,文档本身建议您以其他方式。这些功能需要非常小心才能正确使用。除了特殊的低级应用程序,同步最好使用通道或同步包的工具来完成。通过通信共享内存;不要通过共享内存进行通信。
随时随地看视频慕课网APP

相关分类

Go
我要回答