【问题标题】:Golang are package block variables thread safe?Golang 是包块变量线程安全的吗?
【发布时间】:2014-01-05 01:59:26
【问题描述】:

根据 Go 规范:

“表示在顶层(任何函数之外)声明的常量、类型、变量或函数(但不是方法)的标识符的范围是包块。”

包块变量是线程安全的吗?例如。如果我有一个包块变量来存储 Web 应用程序的当前用户:

var CurrentUser *string

请求 1 进来:将 CurrentUser 设置为“John” 请求 2 进来:将 CurrentUser 设置为“Fred”

在请求 1 中,CurrentUser 的值是多少?

【问题讨论】:

  • 线程安全通常用于表示并行读取或写入不会造成恶作剧。但我认为您要求的是 goroutine-local 状态。对吗?
  • 是的。我认为这与 Go 例程在幕后使用线程或多或少是一样的

标签: go


【解决方案1】:

不,包变量不是线程安全的。

在您的示例中,CurrentUser 可以随时从“John”更改为“Fred”——尽管处理请求 1 的 goroutine 不能保证看到更改。

所以你需要使用一个局部变量来存储不同goroutines不同的任何数据。

【讨论】:

  • 我真正想做的是创建面包屑,用户 X 不会干扰用户 Y,我该如何调整 play.golang.org/p/fydmwNmkWU 以使其正常工作?
  • 您需要为每个用户保留单独的面包屑跟踪。像这样:play.golang.org/p/wANVmCQ5E5
  • 选项1肯定行不通;它和原版有同样的问题。选项 2 对我来说不够具体。您希望面包屑路径持续多长时间?哪些事件应该改变它们?
  • 每次请求后,路径可以消失,并在下一次请求时重新填充,没有任何事件会改变它们。
  • 那么线索是什么?只是来自 URL 的路径?
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多