为了账号安全,请及时绑定邮箱和手机立即绑定

转到 http 服务器和全局变量

转到 http 服务器和全局变量

Go
牛魔王的故事 2021-06-11 18:00:05
我有一个http服务器。它是用 Go 编写的。我有这个代码:package mainimport (    "net/http"    "runtime")var cur = 0func handler(w http.ResponseWriter, r *http.Request) {    cur = cur + 1;}func main() {    runtime.GOMAXPROCS(runtime.NumCPU())    http.HandleFunc("/", handler)    http.ListenAndServe(":9010", nil)}安全吗?我可能需要使用互斥锁吗?
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

不,这不安全,是的,您需要锁定某种形式。每个连接都在它自己的 goroutine 中处理。有关详细信息,请参阅Serve() 实现。


一般模式是使用 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

}


查看完整回答
反对 回复 2021-06-28
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

除非我忽视的东西,在这种情况下,而不是使用锁(或频道),你可以使用的工具发现,在sync/atomic包(虽然你需要让你的类型无论是int32int64

但是,文档本身建议您以其他方式。

这些功能需要非常小心才能正确使用。除了特殊的低级应用程序,同步最好使用通道或同步包的工具来完成。通过通信共享内存;不要通过共享内存进行通信。


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信